Временно измените глобальную переменную JavaScript - PullRequest
3 голосов
/ 08 июля 2011

Я пытаюсь незаметно поменять одну библиотеку на другую, но только для заданной области. Вот упрощенный набросок проблемы. 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 ]

1 голос
/ 08 июля 2011

Попробуйте 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()

Попробуйте с помощью Lib (..., x) передать x в качестве библиотеки "$".

1 голос
/ 08 июля 2011

Вы можете использовать анонимную функцию для создания области действия, где $ равно 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 голос
/ 08 июля 2011

В верхней части функции (или функций), которые используют старую библиотеку, вы можете заменить ссылку $, но только в локальной области следующим образом:

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

Это не повлияетглобальные значения для $, x и y, но будут работать только для вызовов в пределах doStuff.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...