1、默认绑定全局变量,在全局函数中:
function fn(){ console.log(this.a); } var a=2; fn();//这里调用的是window
2、隐式绑定:
function fn(){ console.log(this.a); } var obj={ a:2, fn:fn }; obj.fn();//这里隐式的调用了obj对象,这里绑定了obj对象
这里要说明的是让函数传递引用,致使this绑定的上下文改变。则this的失去隐式绑定:
function fn(){ console.log(this.a); } var obj={ a:2, fn:fn }; var bar = obj.fn; var a = "wocao"; bar();//wocao
3、显示绑定,利用apply,call,bind:
function fn(){ console.log(this.a); } var obj={ a:2 }; fn.call(obj);//不传则为全局变量
4、new构造对象:
function fn(a){ console.log(this.a); } var bar = new fn(2); console.log(bar.a);//这里注意bar并不是一个函数,只是一个被赋值的变量对象
5、eval函数中this指向:
function fn(){ eval("console.log(this.a)"); } var obj = { a:3, fn:fn }; var a = 0; obj.fn();//3,当前函数执行的作用域
上面的代码有点挫,换了一个 var name = "window"; var Bob = { name: "Bob", showName: function(){ eval("alert(this.name)"); } }; Bob.showName(); //Bob
var name = "window"; var Bob = { name: "Bob", showName: function(){ alert(this.name); } }; Bob.showName(); //Bob,其实就是没影响啦
6、setTimeout,setInterval都会把对象变成全局,两个因为是异步执行的