this作为全局对象window的几种情况
- 作为函数调用的this
- 作为内部嵌套函数的this
- 在setTimeout、setInteval中this仍然是全局变量window
this为非全局变量的几种情况
构造函数(构造函数就是通过函数生成一个新的对象,这时this指的为这个新对象)
-
做为对象方法调用,如:
var obj1 = { name: 'Byron', fn : function(){ console.log(this); } }; obj1.fn(); // obj1 var fn2 = obj1.fn; fn2(); //此时this仍然指的是全局对象window
DOM对象绑定事件this代表源DOM对象(低版本IE下有bug,也指向window)
-
使用bind函数,绑定原函数,此时this指的是传入bind的第一个参数。如:
var obj1 = { name: 'Byron', fn : function(){ console.log(this); } }; obj1.fn(); //obj1 var fn2 = obj1.fn; fn2(); //此时this仍然指的是全局对象window var fn3 = obj1.fn.bind(obj1); fn3(); //此时this指的为obj1(此方法比较灵活,可利用此方法将所要传送给this 的参数指定为bind的第一个对象)
-
apply和call设置this,如:
fn.call(context,num1,num2...); fn.apply(context,numArray)
第一个参数为this对象,不同点是call接受参数列表,apply接受参数数组。
-
caller,如果一个函数f是在全局作用域内被调用的,则f.caller为null,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.可以简单的理解为caller指的是他的父函数。如:
function fn(){ console.log(fn.caller); function fn2(){ console.log(fn2.caller) } fn2() } fn();
-
callee,当函数被调用的时候arguments.callee(匿名函数的时候很好用,可以调用自身)
var i = 1; window.onclick = function(){ console.log(1); if(i<5){ i++; setTimeout(arguments.callee,200); } }
- 本博客版权归羞涩的涩和饥人谷所有,转载请注明出处