一:this 是在函数被调用时确定的,它的指向完全取决于函数调用的地方,而不是它被声明的地方(除箭头函数外)。当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this 就是这个记录的一个属性,它会在函数执行的过程中被用到。
二:this 在函数的指向有以下几种场景:
作为构造函数被 new 调用;
作为对象的方法使用;
作为函数直接调用;
被 call、apply、bind 调用;
箭头函数中的 this;
1.1: new 绑定
函数如果作为构造函数使用new调用时,this绑定的时新创建得构造函数实例;
function Foo() {
console.log(this)
}
var bar = new Foo() // 输出: Foo 实例,this 就是 bar
1.2: 通过call,apply,bind 我们可以修改函数绑定的this,使其成为我们指定的对象,通过这些方法的第一个参数我们可以显式的绑定this。
但是值得注意的是,call 和 apply 的区别是 call 方法接受的是参数列表,而 apply 方法接受的是一个参数数组。
注意: 若是把null,undefined作为this的绑定对象传入 call,apply,bind,这些值在调用时会被忽略,实际上应用的是默认绑定规则。
func.call(thisArg, arg1, arg2, ...) // call 用法
func.apply(thisArg, [arg1, arg2, ...]) // apply 用法
1.3: 隐式绑定
函数是否在某个上下文对象中被调用,如果是,this则绑定的是这个上下文对象。
var a = 'hello'
var obj = {
a: 'world',
foo: function() {
console.log(this.a)
}
}
obj.foo() // 浏览器中输出: "world"
1.4: 默认绑定
函数独立调用,直接使用不带任何修饰的函数引用进行调用,也就是上面几种绑定途径之外的方式。非严格模式下this绑定到全局对象(浏览器下是window,node环境下是global),严格模式下this绑定到undefined(因为严格模式不允许this指向全局对象)。
to be continued ...