2011-07-08 16 views
3

私はあるライブラリを別のライブラリに目に見えない形で入れ替えるつもりです。ここでは、問題の簡略化したスケッチを示します。 xは古い既存のライブラリを表し、yは新しいライブラリを表し、$は影響を与えたいグローバルです。目標は、withLibがコールバック内のすべてのコードの$から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

どのような2つのフレームワークですか?より良い解決策があるかもしれません。 – alex

+0

ライブラリ 'x'は' jQuery.noConflict() 'で得られた古い未知のバージョンのjQueryまたは類似のライブラリであり、ライブラリ' y'は新しく読み込まれたjQueryです。 'withLib'でラップされたコード(とそのコールバックのどれか)が新しいjQueryを使うことを望みます。可能? – Matt

答えて

1

また
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 $ 
} 

これはグローバル値には影響しません$x、およびyについては、doStuffの範囲内の呼び出しでのみ機能します。

1

は "$" ライブラリとしてのxに渡す(X、...)withLibを試してみてください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() 

を試してみてください。あなたは$yあるスコープを作成するために無名関数を使用することができ

関連する問題