javascript - 为什么 "this"的值会改变。?

标签 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”的值在函数内发生变化。我缺少什么概念?

最佳答案

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

hello.call(myNamespace.myObject); //now you are setting the context explicitly during the function call.

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

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 指向该对象。

关于javascript - 为什么 "this"的值会改变。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19277395/

相关文章:

javascript - 转换为 Typescript 后出现 "this"错误

javascript - 使用两个指针的算法的时间复杂度。是0(n)还是0(n^2)

javascript - camelCase 到 kebab-case

javascript - 如何在回调中访问正确的“this”?

PHP 将 $this 传递给类外的函数

javascript - Angular JS 使用 controllerAs 和带有作用域或 this 变量的语法

javascript - 当代码在 SignalR 回调中时 AngularJS 绑定(bind)延迟

javascript - 将缓冲区(图像)转换为文件

Javascript正则表达式错误(无效的正则表达式:/?/:没有可重复的内容)

scala - 在 Scala 类定义中使用 `this`