美文网首页
javascript中的this指向

javascript中的this指向

作者: iOneWay | 来源:发表于2017-06-09 16:45 被阅读21次

    由于javascript中的this是在运行期绑定的,所以javascript中的this的含义很丰富。它可以是全局对象,当前对象或者是任意对象,这完全取决于函数的调用方式。
    javaScript中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用apply或call调用。下面我们按照调用方式的不同,分别讨论this的含义:

    一、作为对象方法调用

    var point = {
        x : 0,
        y : 0,
        moveTo : function(x, y){
            this.x = this.x + x;
            this.y = this.y + y;
        }
    };
    
    point.moveTo(1, 1) //this 绑定到当前对象,即 point 对象
    

    二、作为函数调用
    函数也可以直接被调用,此时this绑定到全局对象,在浏览器中,window就是全局对象。

    function makeNoSense (x) {
        this.x = x;
    }
    makeNoSense(5)
    x   // ==5
    

    三、内部的函数调用
    对于内部函数,即声明在另外一个函数体内的函数,这种绑定到全局对象的方式会产生另外一个问题。

    var point = {
        x : 0,
        y : 0,
        moveTo : function(x, y) {
            var moveX = function(x){
                this.x = x; //this绑定到了全局对象
            };
            // 内部函数
            var moveY = function(y) {
                this.y = y; //this绑定到了全局对象
            };
    
            moveX(x);
            moveY(y);
        }
    };
    point.moveTo(1, 1);
    point.x;   // ==0
    point.y;    // ==0
    x;      // ==1
    y;      // ==1
    

    为了解决以上问题,一般采用以下方法暂时存储当前上下文的方法:

    var point = { 
    x : 0, 
    y : 0, 
    moveTo : function(x, y) { 
         var that = this; //此时this指向point对象,将其赋值给that
        // 内部函数
        var moveX = function(x) { 
        that.x = x; 
        }; 
        // 内部函数
        var moveY = function(y) { 
        that.y = y; 
        } 
        moveX(x); 
        moveY(y); 
        } 
    }; 
    point.moveTo(1, 1); 
    point.x; //==>1 
    point.y; //==>1
    

    四、作为构造函数调用

    function Point(x, y){ 
       this.x = x;  //this 绑定到新创建的对象上。
       this.y = y; 
    }
    

    五、使用apply或call调用
    我们再一次重申,在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。让我们看一个具体的例子:

    function Point(x, y){ 
       this.x = x; 
       this.y = y; 
       this.moveTo = function(x, y){ 
           this.x = x; 
           this.y = y; 
       } 
    } 
     
    var p1 = new Point(0, 0); 
    var p2 = {x: 0, y: 0}; 
    p1.moveTo(1, 1); 
    p1.moveTo.apply(p2, [10, 10]);
    

    在上面的例子中,我们使用构造函数生成了一个对象 p1,该对象同时具有 moveTo 方法;使用对象字面量创建了另一个对象 p2,我们看到使用 apply 可以将 p1 的方法应用到 p2 上,这时候 this 也被绑定到对象 p2 上。另一个方法 call 也具备同样功能,不同的是最后的参数不是作为一个数组统一传入,而是分开传入的。

    http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

    相关文章

      网友评论

          本文标题:javascript中的this指向

          本文链接:https://www.haomeiwen.com/subject/yhqfqxtx.html