2011-07-08 49 views
3

我试图无意间将一个库替换为另一个库,但仅限于给定范围。这是问题的简化草图。 x代表旧的预存库,y代表新库,$是我想要影响的全局。我们的目标是让withLib成功地将$从x调整为y,以获取其回调中的所有代码。暂时更改JavaScript全局变量

你可以看到这个例子中,我可以影响外部环境中的代码,但不是内部的。我已经尝试在关闭中包装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" 

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

+4

什么是两个框架?可能有更好的解决方案。 – alex

+0

库'x'是通过'jQuery.noConflict()'获得的jQuery或类似库的旧版未知版本,库'y'将是一个新加载的jQuery。我想要在'withLib'中包装任何代码(以及它的任何回调函数)来使用新的jQuery。可能? – Matt

回答

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")  
    } 
} 
1

在使用旧库中的函数(或功能)的顶部,你可以更换$参考,但仅在局部范围内,像这样:

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

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

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中传递的 “$” 库。