暂时更改JavaScript全局变量

时间:2011-07-08 01:40:17

标签: javascript scope closures

我试图将一个库无形地换成另一个库,但仅限于给定的范围。这是问题的简化草图。 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"

我认为答案涉及设置正确的闭包,但我看不出如何。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

尝试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作为“$”库。

答案 2 :(得分:1)

您可以使用匿名函数创建$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")    
    }
}