我正在从MDN here上的示例中了解.bind(),我对此示例所做的唯一更改是我添加了console.log()的地方。
this.x = 9; // this refers to global "window" object here in the browser
var module = {
x: 81,
getX: function() { return this.x; }
};
console.log(module.getX()); // 81
var retrieveX = module.getX;
console.log(retrieveX());
// returns 9 - The function gets invoked at the global scope
// Create a new function with 'this' bound to module
// New programmers might confuse the
// global var x with module's property x
var boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // 81
使用我得到的节点
运行它$ node bind.js
81
undefined
81
'undefined'输出应为'9'。
为什么我没有得到那个输出?
以下是我尝试使用Node的截图:
答案 0 :(得分:4)
使用Node运行它我得到......
因为在NodeJS中,您看似顶级的代码并未在全局范围内运行,因此this
不会引用全局对象。所有NodeJS代码都在NodeJS 模块中运行,这不是全局范围。由于this
未引用全局对象,this.x = 9;
不会在其上创建名为x
的属性,因此当使用错误的{{1}运行未绑定的函数时(this
引用全局对象),this
属性获取undefined
而不是9
,因为没有名为this.x
的全局属性。< / p>
如果您在浏览器中运行该代码,它将执行MDN所说的功能。或者,您可以将x
更改为this.x = 9;
,它也会更改为NodeJS,因为在NodeJS中,global.x = 9;
是对全局对象的引用(就像全局global
一样浏览器中的范围,就像浏览器中的this
标识符一样。
由于这个原因,您会发现许多假设它们在全局范围内运行的代码示例在NodeJS中运行时的行为略有不同。例如,全局范围内的window
在全局对象上创建一个属性,但NodeJS模块顶层的var n;
只创建一个作用于该模块的变量,而不是全局。