Node.js 与 Javascript 闭包

Posted

技术标签:

【中文标题】Node.js 与 Javascript 闭包【英文标题】:Node.js vs Javascript Closure 【发布时间】:2012-05-06 17:32:14 【问题描述】:

我正在阅读 Eloquent javascript Book,其中包含以下代码:

function createFunction()
  var local = 100;
  return function()return local;;

当我通过节点控制台(从命令提示符运行节点)通过调用 createFunction() 运行它时,我得到 [Function] 作为返回值。但是,按照书本应该是100。

所以我的两个问题:为什么会这样?其次,在节点控制台中运行这些小例子是不是测试 JS 代码的坏主意?

【问题讨论】:

史蒂夫,除了我的第二个问题。这是运行这些小示例的最佳方式。我一直在使用节点,你能确认这仍然是一个好方法吗?老实说,我不确定所有部分是如何组合在一起的。我的理解是node是被浏览器淘汰的JS引擎。 【参考方案1】:

对于那些有类似问题的人,我完全错过了双 (),所以调用看起来像 createFunction()()。

【讨论】:

【参考方案2】:

你通过调用createFunction的返回值得到100,它本身就是一个函数。

createFunction()();

...或者也许更清楚...

var new_func = createFunction();

new_func();

function createFunction()
  var local = 100;

 //  v---v-----------------------v return a function from createFunction
  return function()return local;;


  //  v------- the returned function is assigned to the new_func variable
var new_func = createFunction();

 //   v------- the returned function is invoked
new_func();

【讨论】:

【参考方案3】:

您需要调用createFunction()的回复。

createFunction()();

第一次调用 (()) 调用createFunction() 并返回内部函数,第二次调用执行该函数并返回被关闭的local 变量。

只要您知道环境,例如在节点控制台(或任何其他)中运行小示例就可以了。浏览器的控制台一般是eval()'d,这会产生副作用,例如delete 如何显然删除变量,而不仅仅是对象属性。

【讨论】:

我从来没有见过这个!感谢您的澄清!

以上是关于Node.js 与 Javascript 闭包的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 使用闭包“冻结”变量的值

node.js 中的闭包有啥不同吗?

Node.js匿名函数-闭包-Promise

Node.js相关——CommonJS规范

理解js中的Error

node.js