javascript - `this` 在不是类原型(prototype)的函数内

标签 javascript

我正在尝试创建一个没有原型(prototype)的类。这是一个例子:

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

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

最佳答案

this always1 计算调用函数对象的对象。如果它是“无条件调用”(或者是 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

使用变量创建绑定(bind)到当前(调用封闭函数时)的示例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 上下文并且可以被“上下文绑定(bind)”函数使用,例如 Function.bind消除如上所示的显式“ self 关闭”的需要。

关于javascript - `this` 在不是类原型(prototype)的函数内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965485/

相关文章:

javascript - 为什么 javascript 不修改我的变量?

javascript - 如何使用嵌套 array.map 将板上的位置从 React JS 中的 Board 发送到 Cell 组件

javascript - RequireJS:根据环境加载不同的文件

javascript - 忽略包含下拉菜单的 gridview 单元格

javascript - 如何使用post方法向服务器发送值?

javascript - jQuery - 连接 jQuery 对象,相当于多重选择器

javascript - JavaScript 中嵌套对象的 Semver,主要、次要还是补丁?

javascript - 从 jQuery 第二次调用 Mathjax 排版函数不起作用

Javascript DIV 样式高度(IE 和 FF)与 jQuery

javascript - 选择一个选项并发布其值,结果会自动选择该选项