我正在学习 javascript,但我对函数/闭包有一些疑问,我有以下代码:
var obj = { value: 0 };
obj.test = function() {
var that = this;
var f1 = function() {
console.log(that);
};
f1();
};
obj.test();
var x = obj.test;
x();
我知道当像 f() this
这样的函数被调用时引用全局对象,但在我的示例中,当定义 f1 时,它有一个引用 that
到this
引用 obj 的外部函数。
我希望该函数记住创建它的上下文,所以为什么最后一次调用 x()
引用全局对象?
谢谢
最佳答案
I expect that the function remember the context in which it was created
这就是你的错误。在这种情况下,JavaScript 函数不会“记住”与任何特定对象的任何关系。他们唯一记住的是父词法上下文链中的范围内变量。在本例中,“obj”变量就是这样一个变量。
您可以使用 .bind()
方法显式创建一个函数来记住与对象的关系。
obj.boundTest = obj.test.bind(obj);
var x = obj.boundTest;
x(); // will do the right thing
或者更简单:
var x = obj.test.bind(obj);
x();
关于Javascript 函数和 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135488/