为什么“this”的值会发生变化。

时间:2013-10-09 16:17:56

标签: javascript this

我正在学习javascript,我遇到了疑问。为什么“this”的值在第一个示例中未定义,但在第二个示例中正确打印出来。

示例1:

var myNamespace = {
    myObject: {
        sayHello: function() {
            console.log( "name is " + this.myName );
        },
        myName: "john"
    }
};

var hello = myNamespace.myObject.sayHello;

hello(); // "name is undefined"

示例2:

var myNamespace = {
    myObject: {
        sayHello: function() {
            console.log( "Hi! My name is " + this.myName );
        },
        myName: "Rebecca"
    }
};

var obj = myNamespace.myObject;

obj.sayHello();//"Hi! My name is Rebecca"

为什么“this”的值在函数内发生变化。我错过了什么概念?

2 个答案:

答案 0 :(得分:4)

第一种情况,你只是将函数的引用传递给vairable hello,并从全局上下文(浏览器中的窗口,节点中的全局)调用它,所以this成为调用函数的函数除了(绑定函数)。您始终可以使用function.call显式设置上下文,或使用Ecma5 function.bind

将上下文明确设置为函数
hello.call(myNamespace.myObject); //now you are setting the context explicitly during the function call.

或者只是在获取函数引用时绑定它。

var hello = myNamespace.myObject.sayHello.bind(myNamespace.myObject); //Now no matter where you call it from `this` will point to the context of myObject

第二种情况是你从对象本身调用它,所以this指向对象。

答案 1 :(得分:1)

在第一种情况下,隐式this对象是全局范围。由于全局范围内没有myName,因此未定义。

如果您想使用正确this的免费功能,请使用bind

var hello = myNamespace.myObject.sayHello.bind(myNamespace.myObject);