javascript - 临时更改 JavaScript 全局变量

标签 javascript scope closures

我试图在不可见的情况下将一个库换成另一个库,但仅限于给定的范围。这是问题的简化草图。 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"

我认为答案涉及设置正确的关闭类型,但我不知道如何设置。有什么想法吗?

最佳答案

您可以使用匿名函数创建一个范围,其中 $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")    
    }
}

关于javascript - 临时更改 JavaScript 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6619086/

相关文章:

javascript - 如何动态添加多个复选框到html表格?

javascript - 在循环中创建闭包

Javascript - 全局变量和全局范围内的变量是否不同(在 jsfiddle 中)?

javascript - JavaScript 中的闭包内存泄漏模式

function - 语法错误 : Non-declaration statement outside function body

javascript - ionic 6 谷歌帐户 Firebase

javascript - 这个函数中的 detail 是做什么的或意味着什么?

javascript - 如何通过jQuery通过前缀获取元素类

c - C语言递归函数的几个问题

ruby-on-rails-3 - 使用 except 的范围不起作用 Rails