Javascript 选择全局范围而不是局部范围

Javascript 选择全局范围而不是局部范围,javascript,Javascript,我想知道,在Javascript中是否有任何方法可以告诉编译器要使用哪个范围变量 就像在python中附加关键字global,编译器知道您正在使用global one 除了使用不同的名称外,在Javascript中是否还有其他方法可以实现相同的功能 (在下面的示例中,我试图寻找全局“红色”,但它一直被参数“绿色”所遮蔽。) const color=“红色” 常量printColor=(颜色)=>console.log(颜色) printColor(“绿色”)将全局变量直接附加到窗口对象: w

我想知道,在Javascript中是否有任何方法可以告诉编译器要使用哪个范围变量

就像在python中附加关键字
global
,编译器知道您正在使用global one

除了使用不同的名称外,在Javascript中是否还有其他方法可以实现相同的功能

(在下面的示例中,我试图寻找全局“红色”,但它一直被参数“绿色”所遮蔽。)

const color=“红色”
常量printColor=(颜色)=>console.log(颜色)

printColor(“绿色”)
将全局变量直接附加到窗口对象:

window.color=“红色”
const printColor=(color)=>console.log(color,window.color)

printColor(“绿色”)
将全局变量直接附加到窗口对象:

window.color=“红色”
const printColor=(color)=>console.log(color,window.color)

printColor(“绿色”)
我喜欢@symlink的答案,但只是作为附加信息

一种方法是将相应的
this
上下文绑定到函数

例如,由于
var
会将变量(在严格模式之外)提升到
窗口
,因此您可能会执行以下操作:

var color=“蓝色”;
常量printColor=function(){
console.log(this.color)
}
printColor.bind(窗口)()

bind({color:“green”})(
我喜欢@symlink的答案,但只是作为附加信息

一种方法是将相应的
this
上下文绑定到函数

例如,由于
var
会将变量(在严格模式之外)提升到
窗口
,因此您可能会执行以下操作:

var color=“蓝色”;
常量printColor=function(){
console.log(this.color)
}
printColor.bind(窗口)()

bind({color:“green”})(
应该以公平的方式与Python进行比较

在Python中,您有:

x=1#全局
def测试(x):
打印(x)
。。。您不能插入
global
关键字以使该
print(x)
作用于全局
x
,因为您已经将该名称定义为本地名称(参数)

在Python世界中继续一段时间。这将作用于全局变量:

x=1
def test():
打印(x)#全球
…但一旦有赋值,变量将被视为局部变量:

x=1
def test():
x=2#局部
打印(x)
要覆盖此行为,请使用
global

x=1
def test():
全球x
x=2#全局
打印(x)
现在,回到JavaScript。在这里,您可以玩单词
var

要在函数中使用变量,只需省略在其中使用
let
const
var
对其进行定义:

var x = 1;

function test() {
    console.log(x); // global
}
要将变量用作局部变量,请使用
var
let
const

var x = 1;

function test() {
    var x = 2; // local
    console.log(x);
}
所以也没什么不同。在Python中使用
global
关键字时,在JavaScript中不使用
var
let
const
,如果省略Python的
global
,则在JavaScript中使用
var
let
const

globals()
globalThis
Python有
globals()
,当您还有一个同名的局部变量时,可以使用它引用全局变量:

x=1
def测试(x=2):
globals()['x']=3#修改全局变量
在JavaScript中,您可以通过全局对象执行此操作,全局对象在浏览器上下文中是
window
。另请参见更新的。因此,在浏览器上下文中,您可以这样做(但它需要
var
):

不过,最好将全局变量定义为对象的一部分:

var myglobals = { x: 1 };

function test(x = 2) {
    myglobals.x = 3 // mutates myglobals
}

应该以公平的方式与Python进行比较

在Python中,您有:

x=1#全局
def测试(x):
打印(x)
。。。您不能插入
global
关键字以使该
print(x)
作用于全局
x
,因为您已经将该名称定义为本地名称(参数)

在Python世界中继续一段时间。这将作用于全局变量:

x=1
def test():
打印(x)#全球
…但一旦有赋值,变量将被视为局部变量:

x=1
def test():
x=2#局部
打印(x)
要覆盖此行为,请使用
global

x=1
def test():
全球x
x=2#全局
打印(x)
现在,回到JavaScript。在这里,您可以玩单词
var

要在函数中使用变量,只需省略在其中使用
let
const
var
对其进行定义:

var x = 1;

function test() {
    console.log(x); // global
}
要将变量用作局部变量,请使用
var
let
const

var x = 1;

function test() {
    var x = 2; // local
    console.log(x);
}
所以也没什么不同。在Python中使用
global
关键字时,在JavaScript中不使用
var
let
const
,如果省略Python的
global
,则在JavaScript中使用
var
let
const

globals()
globalThis
Python有
globals()
,当您还有一个同名的局部变量时,可以使用它引用全局变量:

x=1
def测试(x=2):
globals()['x']=3#修改全局变量
在JavaScript中,您可以通过全局对象执行此操作,全局对象在浏览器上下文中是
window
。另请参见更新的。因此,在浏览器上下文中,您可以这样做(但它需要
var
):

那会更好