fadeOut,fadeIn:变量引用丢失

时间:2014-11-19 19:36:42

标签: javascript ruby-on-rails backbone.js callback coffeescript

我正在开发一个严重依赖Backbone / CoffeeScript的Rails项目。我无法弄清楚为什么以下代码会导致问题!

switchView: (newView) ->
    myVar = 3
    debugger
    @currentView.$el.fadeOut(-> debugger)

在第一个调试器:myVar等于3.

在第二个调试器:myVar未定义。

为什么我不能从回调函数访问myVar?

我正在寻求一个淡出淡出的情况。我过去通过将fadeIn作为成功回调传递给fadeOut函数来完成此操作。感谢您的帮助,如果有任何问题的相关代码我可以发布,请告诉我。

2 个答案:

答案 0 :(得分:1)

这就是Javascript中闭包的方式。如果变量需要在闭包中,则必须是

  • 全局变量,即不使用var声明它。
  • 或者它应该在封闭内部引用。

在Chrome开发者控制台中尝试以下代码段。

  1. var a = function() {var val = 10; (function() {debugger; console.log('hi');})();};
  2. a();
  3. var a = function() {var val = 10; (function() {debugger; console.log(val);})();};
  4. a();
  5. 执行1st&第二阶段在第二个stmt中,它将触及断点,您可以评估val以查看它是未定义的。多数民众赞成因为val未在封闭内部被引用。

    现在执行第3&第四节在第4个stmt中,一旦它到达断点,你可以看到val是10.那是因为在{mt val

    中的闭包内使用了console.log(val);

答案 1 :(得分:0)

这是因为闭包在JavaScript中的工作方式。具体来说,为了处于闭包范围,变量必须是

  1. 未声明(即函数表达式中没有var myVar)和
  2. 使用(即必须在函数表达式中引用变量)。
  3. 通过添加一些将变量引用到回调中的简单日志记录,我能够看到一个值,至少在JSBin上:

    http://jsbin.com/qofuzefiga/1/edit?js,console

    (请注意,我不是CoffeeScript的人,所以请原谅无知的习语)

    有关详细信息,请参阅此答案: How do JavaScript closures work?