js中关于this的理解

常见:在普通函数中的this,指向 全局

function thisObj(name){
    this.name = name;
    console.log(this);
}

但是在严格模式下的函数,this指向 underfined.

混淆点.内部函数中的this指向:

var numbers = {
   numberA: 5,
   numberB: 10,
   sum: function() {
     console.log(this === numbers); // => true
     function calculate() {
       // this is window or undefined in strict mode
       console.log(this === window); // => true
       console.log(this === numbers); // => false;
       return this.numberA + this.numberB;
     };
     return calculate();
   }
};
numbers.sum();

在上述numbers对象中,sum函数是numbers对象的方法。所以sum函数中的this指向numbers对象。

但是在内部函数calculate中,我们如果以为this也是指向numbers对象那就打错特错了。

在这里该内部对象是一个函数调用,并不是对象的方法。所以calculate中的this指向 window。

所以为了避免calculate中的this指向错误。要进行如下修改,将this值指向numbers对象。

var numbers = {
   numberA: 5,
   numberB: 10,
   sum: function() {
     console.log(this === numbers); // => true
     function calculate() {
       // this is window or undefined in strict mode
       console.log(this === window); // => true
       console.log(this === numbers); // => false;
       return this.numberA + this.numberB;
     };
     return calculate.call(this);//return calculate();
   }
};
numbers.sum();

混淆点.从Object中分离的方法

function People(name){
    this.name = name;
    this.action = function(){
        console.log("this是否等于window " + this === window)
        console.log(this.name)
    }
}
var xiaoA = new People('xyf');
var zz = xiaoA.action;
zz();  //输出错误
xiaoA.action() // 输出 xyf
setInterval(xiaoA.action,500000);//错误
setInterval(xiaoA.action.bind(xiaoA),500000);//循环输出 xyf
这里要注意  如果直接输出 xiaoA.action();是可以正确输出的。但是当我们将xiaoA.action赋值给变量zz之后。该action方法就从原来的Object中分离了。这时候的this指向全局变量。setInterval定时器也会产生这样的问题。如果要正确显示需要用bind重新绑定对象。
var zz =xiaoA.action.bind(xiaoA);
zz(); //输出 xyf

apply调用

apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。apply()的参数为空时,默认调用全局对象。

posted @ 2016-07-28 15:13  德森  阅读(393)  评论(0编辑  收藏  举报