.bind()示例输出不正确

时间:2017-03-05 15:57:03

标签: javascript node.js bind

我正在从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的截图:

enter image description here

1 个答案:

答案 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;只创建一个作用于该模块的变量,而不是全局。