第二章 this call apply

2016-09-27  本文已影响0人  狐尼克朱迪

this

this是js中很坑的地方,如下面的程序:

    <body>
        <div id="div1">一个div</div>
        <script>
            window.id = 123;
            document.getElementById("div1").onclick = function(){
              console.log(this.id) // div1
              var callback = function(){
                console.log(this.id); // 12
              }
              callback();
            
              // 解决办法
              var that = this;
              var callback = function(){
                console.log(that.id); // div1
              }
          }
        </script>
    </body>

另外一个例子:

    // 如果构造器显示地返回一个Object类型对象,那么此次运算结果最终返回这个对象,而不是我们之前期待的this
    var myClass = function(){
        this.name = "ahu";
        return {
            name: "liuahu"
        };
    };
    
    var obj = new myClass();
    obj.name == "liuahu" // true
    
    // 如果构造器不显示地返回任何数据,或者是返回一个非对象类型的数据,就不会出现上面的问题
    var myClass = function(){
        this.name = "ahu";
        return "liuahu"
    };
    
    var obj = new myClass();
    obj.name == "ahu" // true

this丢失现象:在一些框架里,经常会出现下面的例子:

    // 1. 常见形式
    var getId = function(id){
        return document.getElementById(id);
    }
    getId("div1");
    
    // 2.尝试形式:
    var getId = document.getElementById;
    getId("div1");
    

第二种方式执行时,会出现一个异常,这是因为第二种的this为window,但是document.getElementById是需要用到this,而其期望的this是document。

call和apply

call和apply这两个方法的主要作用就是改变this指向,另外新的ECMAScript标准中的bind方法可以改变this指向。

    Function.prototype.bind = function(){
        var _args = arguments,
            _object = arguments[0],
            _function = this;
        return function(){
            // not use slice for chrome 10 beta and Array.apply for android
            var _argc = [].slice.call(_args,1);
            [].push.apply(_argc,arguments);
            return _function.apply(_object||window,_argc);
        };
    }
上一篇下一篇

猜你喜欢

热点阅读