2011-07-08 109 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中傳遞的 「$」 庫。