我试图将一个库无形地换成另一个库,但仅限于给定的范围。这是问题的简化草图。 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"
我认为答案涉及设置正确的闭包,但我看不出如何。有什么想法吗?
答案 0 :(得分:1)
在使用旧库的函数(或函数)的顶部,您可以替换$
引用,但只能在本地范围内替换:
function doStuff() {
var $ = x;
// do stuff with $
}
这不会影响$
,x
和y
的全局值,但仅适用于doStuff
范围内的调用。
答案 1 :(得分:1)
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")
}
}