浅谈js的this指向问题
2021-04-02 17:27
标签:bin function 没有 有一个 cal 多个 ict class 相同 JavaScript里函数的this指向,是一个挺难弄清楚的问题。网上大佬们的总结是: 如下,函数fn加小括号时它没有前缀,这时对它的调用fn()其实相当于window.fn(),所以this指向的是window。 但是这种情况在严格模式时有些不同 如下,函数fn的属于对象obj的属性: 可以看到,调用fn时它的前缀是obj,所以它的this指向对象obj。 我们来看一种复杂的: 我们在全局下调用fn2,其结果为: 由结果分析: 此时该this指向window( setInterval setTimeout 等) 箭头函数的this是上一层上下文的this。 call方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向。 apply方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向。 bind方法是把获取到的函数重新封装,返回一个新的函数地址。新地址的this指向改变。 bind、call和apply的不同之处: 相同之处: 以上内容全是本人的一点拙见,如有错误,还望各位大佬指正。 浅谈js的this指向问题 标签:bin function 没有 有一个 cal 多个 ict class 相同 原文地址:https://www.cnblogs.com/qncsssznds/p/12549424.html
哪个对象调用函数,函数里面的this就默认指向哪个对象。(注意this指向的只能是对象)
我个人把这句话理解成:看它函数名后加小括号时它的前缀是什么。
为什么说“默认指向”?因为JavaScript给我们提供了几种可以改变函数this指向的方法bind、call和apply。
接下来我们分别举几种常见情况来帮助理解this的默认指向。一、全局作用域的函数中,this默认指向全局对象window。
function fn(){
console.log(this);//window
}
fn();
严格模式下,一般函数调用(不是对象的方法调用,也不使用apply/call/bind等修改this),this指向undefined,而不是全局对象。这是严格模式所规定的。function fo(){
‘use strict‘
console.log(this);//undefined
}
fo();
二、对象里的函数,this指向该对象。
var obj = {
a:1,
fn:function(){
console.log(this);
}
}
obj.fn();//obj
先声明一个全局作用域下的方法fn,它的功能是输出自己的this,在声明对象obj1和obj2,obj1里声明一个属性fn1,其功能与fn相同,obj2里也声明的属性fn2,除了和fn相同的功能外,fn2还调用了fn和fn1。function fn(){
console.log(this);
}
var obj1 = {
a: 1,
fn1: function () {
console.log(this);
}
}
var obj2 = {
a: 2,
fn2: function () {
fn();
obj1.fn1();
console.log(this);
}
}
obj2.fn2();
//Window
//Object { a: 1, fn1: fn1() }
//Object { a: 2, fn2: fn2() }
三、函数作为Window内置函数的回调函数调用
var timer =null;
timer = setInterval(function(){
console.log(this);
},1000);
四、箭头函数的this指向存在差异:
箭头函数的this指向在声明函数的时候就固定了,终身不变。
箭头函数时ES6中的内容,本人了解的还不够多,这里就先不赘述了。五、更改this指向的方法:
1、call
语法: 函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数2, ...) var obj = { name: ‘Jack‘ }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, 1, 2)
2、apply
语法: 函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...]) var obj = { name: ‘Jack‘ }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, [1, 2])
3、bind
语法:函数.bind(要改变的 this 指向, bind传递的参数1, bind传递参数2, ...);function fo(a, b){
console.log(this, a, b);
}
var poo = fo.bind( {a : 1} );
console.log(poo)// ? fo(a, b) { console.log(this, a, b); }