JavaScript:this对象的理解

JavaScript的this指针的指向

在浏览器的环境下,全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this 对象通常指向window。

console.log(this == window); //true

var name = "window";

var object1 = {
    name: "object1",
    getName: function(){
        return this.name;
    }
};

console.log(object1.getName());  // object1

var object2 = {
    name: "object2",
    getName: function(){
        return function(){
        // 因为返回值是一个匿名函数,匿名函数中的this是window
            return this.name;
        }
    }
};
console.log(object2.getName()()); // window

解决办法

要想在对象的方法中使用this对象,可以如下这么写

var object3 = {
    name: "object3",
    getName: function(){
        var that = this; // 此时的this还是指向这个对象
        return function(){
            return that.name;
        }
    }
};

console.log(object3.getName()()); // object3

更神奇的写法

var name = "window";

var object = {
    name: "object",
    getName: function(){
        return this.name;
    }
};


console.log(object.getName);
console.log(object.getName());  // object
console.log((object.getName)()); // object
console.log((object.getName = object.getName)()); // window

在这里getName是一个函数指针(引用C++的说话),指向的是一个函数,那么把getName打印出来是什么呢?

ƒ (){
    return this.name;
}

是一个函数体,而且是匿名函数,所以最后一个console,把object.getName这个匿名函数赋值给object.getName时,this的指向变了,this现在指向window,所以输出的是window。上述写法和下面的写法是一个效果。

var name = "window";

var object = {
    name: "object",
};
// 直接用匿名函数 
object.getName = function(){
// 这里的this就是window
    return this.name;
}


console.log(object.getName);
console.log(object.getName());  // object
console.log((object.getName)()); // object
console.log((object.getName = object.getName)()); // window

猜你喜欢

转载自blog.csdn.net/tsfx051435adsl/article/details/82824016
今日推荐