为啥这个javascript函数失去了闭包范围?

Posted

技术标签:

【中文标题】为啥这个javascript函数失去了闭包范围?【英文标题】:Why is this javascript function losing closure scope?为什么这个javascript函数失去了闭包范围? 【发布时间】:2012-01-24 18:03:47 【问题描述】:

我在 node.js 中运行它。为什么以下代码段失去了cb var 的范围?

Client.prototype.post = function(path, data, callback) 
  var self = this;
  var cb = callback;
  return function() 
    console.log(path);
    console.log(cb);
    rest.post(self.baseUrl + path, data).on('complete', cb || this.callback);
  
;

对该函数的调用类似于client.post('/user', , function() ); 并输出以下内容:

/user
undefined

我希望第二行是 [Function] 返回的函数可能正在使用 js 的 .call().apply() 方法执行以更改它运行的范围。但我认为 @987654331 @ 可以像 path 一样访问。

更新:将回调包装在一个函数中使其工作。但我仍然想解释一下这里发生的事情。

var cb = function()  callback(); ;

【问题讨论】:

call/apply 更改上下文,而不是范围。你说的是不应该发生的事情,你能链接到实际的代码吗? 为我工作:jsfiddle.net/Squeegy/Uf9nD 您的问题可能出在其他地方... gist.github.com/1503056 第 33-41 行。该文件用作使用 vowsjs 的测试套件的一部分 这不是问题所在,问题在于您如何调用 post 函数。那个代码在哪里? 我无法重现该问题。请更新minimal test case 以制作具有代表性的样本。注意你不需要cb;由于callback 在范围内,它将被闭包捕获。 【参考方案1】:

它按预期工作。问题是错误的,所有的 cmets 都是正确的。有人需要学习如何编码。

【讨论】:

以上是关于为啥这个javascript函数失去了闭包范围?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:为啥访问闭包变量可能很慢

Javascript闭包

JavaScript作用域链

JavaScript 作用域(链)预解析闭包函数

javascript中的闭包closure详解

JavaScript中的“闭包”