以下部分:
var obj = {
name:'Tom',
sayHello:function() {
console.log("hello," + this.name);
}
}
var name = 'Kevin';
var method = obj.sayHello;
method();
将得到输出:
hello,undefined
但是,如果将 var name = 'Kevin';
更改为 name = 'Kevin';
输出将为 hello,Kevin
。为什么它们不同?
最佳答案
答案有两部分:
当您使用
var method = obj.sayHello;
时,您正在将函数与obj
解耦。当您调用 a 方法而不给它一个显式对象(即method()
而不是obj.sayHello()
)时,JavaScript 会设置this
到全局对象,window
。当您使用
var name = 'Kevin'
定义变量时,您正在创建一个具有函数作用域的局部变量。当您使用name = 'Kevin'
定义变量时,您将创建一个附加到全局对象window
的全局变量。这与编写window.name = 'Kevin'
相同。
这两件事结合起来意味着,在 sayHello
中,this
是 window
,this.name
是凯文
。
要解决此问题,您需要使用 bind
,它返回方法的副本,其上下文固定为作为 bind
参数提供的对象:
var method = obj.sayHello;
new_method = method.bind(obj);
new_method(); // hello, Tom
关于javascript - 比较 Javascript 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037404/