绑定方式
1.默认绑定:
function foo() {
console.log( this.a ); // this -> window
}
var a = 2;
foo(); // 2
注意:严格模式下,绑定到undefined
2.隐式绑定:
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); // 2
3.显示绑定:apply/call/bind
function foo() {
console.log( this.a );
}
var obj = {
a: 2
}
foo.call(obj)
4.硬绑定:bind
function foo() {
console.log( this.a );
}
var obj = {
a: 2
}
// 硬绑定无法再修改其this
// 每次进入都会指定绑定
// es5中因此类似出了一个bind()
var bar = foo.bind(obj)
var b = bar(3)
5.new绑定:
new的执行过程:
1.创建一个全新对象;
2.新对象会被执行[[原型]]连接;
3.新对象绑定到函数调用的this;
4.自动返回新对象;
优先级: new > bind > apply/call > 隐式 > 默认
额外
function.apply(null)/function.apply(undefined):
副作用:如果某个函数确实使用了this,则会默认把this绑定到全局;
推荐使用:function.apply(Object.create(null))
注意
this在运行时绑定的,并非在编写时确定;
this的绑定和函数声明位置无任何关系,只取决于函数的调用方式;