`this`在一个不是类原型的函数中

时间:2012-06-10 00:05:18

标签: javascript

我正在努力创建一个没有原型的课程。这是一个例子:

test = (function() {
  this.value = 1;
  this.print = function() {
    console.log(this.value);
  };
  return this;
})();

这完全符合预期。我不明白的是this.value函数中的this.printthis.print如何正确地知道this提及test而非window?通过this.___ = function(){}定义的任何函数是否会自动添加this作为上下文?

1 个答案:

答案 0 :(得分:11)

this 始终 1 调用函数对象时评估对象。它将评估为window,如果它是“无任何调用”(或者是window的属性)。

(请注意,this 不是变量,因此在闭包中关闭!这就是为什么有时需要关闭来获取“正确”this通常为变量selfthat_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.callFunction.apply函数允许指定this上下文,并且可以由“{3}}等”上下文绑定“函数使用,以消除对显式”自闭合“的需要如上所示。