【问题标题】:Temporarily change a JavaScript global variable临时更改 JavaScript 全局变量
【发布时间】:2011-09-30 22:29:06
【问题描述】:

我正在尝试以不可见的方式将一个库换成另一个库,但仅限于给定的范围。这是问题的简化草图。 x 代表旧的现有库,y 代表新库,$ 是我想要影响的全局。目标是让withLib 成功地将其回调中所有代码的 $ 从 x 更改为 y。

您可以通过这个示例看到,我可以影响外部上下文中的代码,但不能影响内部上下文。我尝试将callback() 包装在一个闭包中,但这也没有完全做到。

x = "1.0"
y = "2.0"
$ = x;

withLib = function(callback) {
  $ = y
  callback()
  $ = x
}

withLib(function(){
    console.log($, $ == "2.0" ? "outer success" : 'outer fail')
    someCb = function() {
        console.log($, $=="2.0" ? "inner success" : "inner fail")    
    }
})

someCb() 

// results in "outer success" and "inner fail"

我认为答案涉及设置正确的关闭方式,但我不知道如何。有什么想法吗?

【问题讨论】:

  • 哪两个框架?可能有更好的解决方案。
  • Library x 是一个未知的旧版本的 jQuery 或类似的 lib,通过 jQuery.noConflict() 获得,library y 是一个新加载的 jQuery。我想要任何包含在withLib 中的代码(以及它的任何回调)来使用新的 jQuery。可能吗?

标签: javascript scope closures


【解决方案1】:

在使用旧库的函数(或多个函数)的顶部,您可以替换 $ 引用,但只能在本地范围内,如下所示:

function doStuff() {
    var $ = x;
    // do stuff with $
}

这不会影响$xy 的全局值,但仅适用于doStuff 范围内的调用。

【讨论】:

    【解决方案2】:

    试试http://jsfiddle.net/rQ54s/

    x = "1.0"
    y = "2.0"
    
    withLib = (function(callback, $) {
      callback($)
    })
    
    withLib(function($){
      console.log($, $ == "2.0" ? "outer success" : 'outer fail')
      someCb = function() {
        console.log($, $=="2.0" ? "inner success" : "inner fail")    
      }
    }, y)
    
    someCb()
    

    尝试 withLib(..., x) 将 x 作为 "$" 库传入。

    【讨论】:

      【解决方案3】:

      您可以使用匿名函数创建$y 的范围:

      x = "1.0"
      y = "2.0"
      $ = x;
      
      (function ($) {
      
          console.log($, $ == "2.0" ? "outer success" : 'outer fail')
          someCb = function() {
              console.log($, $=="2.0" ? "inner success" : "inner fail")    
          }
      
      }(y));
      
      someCb()
      

      或者,通常要避免使用关键字with,但如果你已经设置好了:

      with ({'$': y}) {
          console.log($, $ == "2.0" ? "outer success" : 'outer fail')
          someCb = function() {
              console.log($, $=="2.0" ? "inner success" : "inner fail")    
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        相关资源
        最近更新 更多