标签:
1. 默认绑定:this绑定在函数调用的位置。只在非严格模式下,才能绑定到调用位置,严格模式下与调用位置无关。
function foo(){ console.log(this.a); } var a = 2; foo(); // 2
2. 隐式绑定:this绑定需要考虑调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含。this绑定到函数引用的上下文对象上。
function foo(){ console.log(this.a); } var obj1 = { a:1, foo:foo }; var obj2 = { a:2, obj1:obj1 }; obj2..obj1.foo(); // 1
注:对象属性引用链中只有最顶层或者说最后一层会影响调用位置。
隐式丢失:被隐式绑定的对象会丢失,然后采用默认绑定,从而把this绑定到全局对象或undefined上,取决于是否是严格模式。其根源是函数对象传递是传的引用,不是复制,与中间经过的各种历程无关,只是与初始定义有关 。
function foo(){ console.log(this.a); } var obj = { a:0, foo:foo }; var bar = obj.foo; // 函数别名 var a = "global"; bar(); // "global"
3. 显式绑定:使用函数的call()/apply()方法进行this绑定。它们的第一个参数是一个对象,会把这个对象绑定到this。
function foo(){ console.log(this.a); } var obj = { a:0, }; foo.call(obj); // 0
call(obj,var1,var2,···),apply(obj,[var1,var2,···])
4. new绑定:使用new调用函数(构造函数调用),将this绑定到新构建的对象上。
function foo(){ this.a = a; } var bar = new foo(0); console.log(bar.a); // 0
标签:
原文地址:http://www.cnblogs.com/syfwhu/p/5557637.html