我正在开发一个严重依赖Backbone / CoffeeScript的Rails项目。我无法弄清楚为什么以下代码会导致问题!
switchView: (newView) ->
myVar = 3
debugger
@currentView.$el.fadeOut(-> debugger)
在第一个调试器:myVar等于3.
在第二个调试器:myVar未定义。
为什么我不能从回调函数访问myVar?
我正在寻求一个淡出淡出的情况。我过去通过将fadeIn作为成功回调传递给fadeOut函数来完成此操作。感谢您的帮助,如果有任何问题的相关代码我可以发布,请告诉我。
答案 0 :(得分:1)
这就是Javascript中闭包的方式。如果变量需要在闭包中,则必须是
var
声明它。 在Chrome开发者控制台中尝试以下代码段。
var a = function() {var val = 10; (function() {debugger;
console.log('hi');})();};
a();
var a = function() {var val = 10; (function() {debugger;
console.log(val);})();};
a();
执行1st&第二阶段在第二个stmt中,它将触及断点,您可以评估val
以查看它是未定义的。多数民众赞成因为val
未在封闭内部被引用。
现在执行第3&第四节在第4个stmt中,一旦它到达断点,你可以看到val
是10.那是因为在{mt val
console.log(val);
答案 1 :(得分:0)
这是因为闭包在JavaScript中的工作方式。具体来说,为了处于闭包范围,变量必须是
var myVar
)和通过添加一些将变量引用到回调中的简单日志记录,我能够看到一个值,至少在JSBin上:
http://jsbin.com/qofuzefiga/1/edit?js,console
(请注意,我不是CoffeeScript的人,所以请原谅无知的习语)
有关详细信息,请参阅此答案: How do JavaScript closures work?