关于this

2016-08-01  本文已影响20人  羞涩的涩

this作为全局对象window的几种情况

  1. 作为函数调用的this
  2. 作为内部嵌套函数的this
  3. 在setTimeout、setInteval中this仍然是全局变量window

this为非全局变量的几种情况

  1. 构造函数(构造函数就是通过函数生成一个新的对象,这时this指的为这个新对象)

  2. 做为对象方法调用,如:

    var obj1 = {
        name: 'Byron',
        fn : function(){
            console.log(this);
        }
    };
    
    obj1.fn(); // obj1
    
    var fn2 = obj1.fn;
    
    fn2();  //此时this仍然指的是全局对象window
    
  3. DOM对象绑定事件this代表源DOM对象(低版本IE下有bug,也指向window)

  4. 使用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的第一个对象)
    
  5. apply和call设置this,如:

    fn.call(context,num1,num2...);
    fn.apply(context,numArray)
    

第一个参数为this对象,不同点是call接受参数列表,apply接受参数数组。

  1. caller,如果一个函数f是在全局作用域内被调用的,则f.caller为null,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.可以简单的理解为caller指的是他的父函数。如:

    function fn(){
        console.log(fn.caller); 
        function fn2(){
            console.log(fn2.caller)
        }
        fn2()
    }
    
    fn();
    
  2. callee,当函数被调用的时候arguments.callee(匿名函数的时候很好用,可以调用自身)

    var i = 1;
    window.onclick = function(){
        console.log(1);
        if(i<5){
            i++;
            setTimeout(arguments.callee,200);
        }
    }
    
    

上一篇下一篇

猜你喜欢

热点阅读