美文网首页
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/

相关文章

  • 关于js函数中this的指向的问题

    @(javascript)[JavaScript中this的指向] 关于js函数中this的指向的问题 javas...

  • JavaScript中this指向

    文章较长,希望你耐心阅读并有所收获。 this指向 想必各位看客老爷搜索此问题,多多少少还是被this迷惑住了,今...

  • javascript中的this指向

    写在前面 本文转自深入浅出 JavaScript 中的 this 在java等面向对象的语言中,this关键字的含...

  • Javascript 中 this 的指向

    大家好,我是IT修真院武汉第10期学员,一枚正直、纯洁、善良的前端程序员。 今天给大家分享一下,修真院官网任务...

  • JavaScript中的this指向

    1.概念 在JavaScript中,this 是指当前函数中正在执行的上下文环境,因为这门语言拥有四种不同的函数调...

  • javascript中this的指向

    在面向对象的语言中(例如Java,C#等),this含义是明确且具体的,即指向当前对象。一般在编译期绑定。而在ja...

  • javascript中的this指向

    由于javascript中的this是在运行期绑定的,所以javascript中的this的含义很丰富。它可以是全...

  • javaScript中this的指向

    简单笔记: this永远指向调用它的对象,在严格模式下没有调用对象会指向undefined,非严格模式下指向全局变...

  • javascript中的this指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上...

  • Javascript中this的指向

    this的指向分为以下四种1.作为对象的方法调用2.作为普通函数调用3.构造器调用4.Function.proto...

网友评论

      本文标题:javascript中的this指向

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