【问题标题】:fadeOut, fadeIn: Variable references lostfadeOut,fadeIn:变量引用丢失
【发布时间】:2014-11-19 19:36:42
【问题描述】:

我正在处理一个严重依赖 Backbone/CoffeeScript 的 Rails 项目。我不明白为什么下面这段代码会导致问题!

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

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

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

为什么我无法通过回调函数访问 myVar?

我要进行淡出,淡入的情况。我过去通过将fadeIn 作为成功回调传递给fadeOut 函数来完成此操作。感谢您的帮助,如果我可以发布针对此问题的更多相关代码,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    这就是 Javascript 中闭包的工作方式。如果一个变量需要在闭包中,它必须是

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

    在 Chrome 开发者控制台中尝试以下 sn-ps。

    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();

    执行第 1 步和第 2 步。在第二个 stmt 中,它会到达断点,您可以评估 val 以查看它是未定义的。那是因为 val 在闭包内没有被引用。

    现在执行 3rd & 4th stmt。在第4个stmt中,一旦它到达断点,你可以看到val是10。那是因为val在stmt console.log(val);的闭包内使用

    【讨论】:

      【解决方案2】:

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

      1. 未声明(即函数表达式中没有var myVar),并且
      2. 已使用(即必须在函数表达式中引用该变量)。

      通过在回调中添加一些引用变量的简单日志记录,我能够看到一个值,至少在 JSBin 上:

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2013-11-28
        • 2016-06-29
        • 2019-12-23
        • 2011-10-02
        相关资源
        最近更新 更多