我正在努力创建一个没有原型的课程。这是一个例子:
test = (function() {
this.value = 1;
this.print = function() {
console.log(this.value);
};
return this;
})();
这完全符合预期。我不明白的是this.value
函数中的this.print
。 this.print
如何正确地知道this
提及test
而非window
?通过this.___ = function(){}
定义的任何函数是否会自动添加this
作为上下文?
答案 0 :(得分:11)
this
始终 1 在 调用函数对象时评估对象。它将评估为window
,如果它是“无任何调用”(或者是window
的属性)。
(请注意,this
不是变量,因此在闭包中不关闭!这就是为什么有时需要关闭来获取“正确”this
通常为变量self
或that
或_this
所知。)
例如:
function f () { return this; }
var a = {f: f}
var b = {f: f}
a.f() === a // true
b.f() === b // true
f() === window // true
使用变量创建与当前绑定的示例(截至调用封闭函数时)this
:
test = (function() {
var self = this // <-- variable, which is "closed over"
this.value = 1; // self === this
this.print = function() {
console.log(self.value); // <-- self "names" previous this object
};
return this;
})();
1 这是一个小谎言。 Function.call
和Function.apply
函数允许指定this
上下文,并且可以由“{3}}等”上下文绑定“函数使用,以消除对显式”自闭合“的需要如上所示。