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 闭包的主要内容,如果未能解决你的问题,请参考以下文章