Javascript 我对以下变量范围的理解是否正确
我目前正在学习Javascript 我提出了以下代码示例Javascript 我对以下变量范围的理解是否正确,javascript,Javascript,我目前正在学习Javascript 我提出了以下代码示例 var gc = "From Global"; var mp = { gc : "Inside mp", funct : function(){ console.log( gc); //Calls global instead of local } } var ft = function() { gc = "Inside Function"; this.
var gc = "From Global";
var mp = {
gc : "Inside mp",
funct : function(){
console.log( gc); //Calls global instead of local
}
}
var ft = function() {
gc = "Inside Function";
this.funct = function(){
console.log(gc); //Calls locally declared variable
}
}
mp.funct(); //calls gc from global scope --->A
var inst = new ft();
inst.funct(); //calls gc from its local scope --->B
我想知道为什么语句A打印全局变量的值,而语句B打印其局部作用域变量的值。我被告知,这与以下事实有关:语句B创建一个ft实例,其上下文是ft,而语句A上下文是窗口,全局局部窗口的局部变量是gc gloable。对吗?如果是这样的话,那么我很困惑,我的印象是什么
foo.bar() ; //Here foo is the context
m.j; //Here m is the context
Windows如何成为MDN中引用的mp.funct()
的上下文
JavaScript有两个作用域:全局和局部。一个变量
在函数定义之外声明的是一个全局变量,其
值在整个程序中是可访问和可修改的。变数
在函数定义中声明的是局部的。它是被创造出来的
每次执行该函数时都会被销毁,并且不能
由函数外部的任何代码访问。JavaScript不支持
块范围(其中一组大括号{…}定义了一个新范围),
块作用域变量的特殊情况除外
在您的代码中,mp
在全局范围内定义,在函数ft
之外。调用在mp
中定义的函数时,成员funct
将不会“看到”同一对象中的其他成员。它能看到的是mp
所在的上下文
当您在ft
中执行相同的操作时,gc=“inside…”代码>正在更改全局变量gc
。因此,当您使用gc
时,它实际上是在全局范围内使用该函数
编辑
感谢@t.niese指出一个错误,gc
未在本地定义。刚刚修改。“mp”是一个Javascript对象,“ft”是一个函数。这就是区别
mp.gc和mp.funct是Javascript对象中的“键”,而不是变量。如果您希望mp使用mp.gc,可以执行以下操作:
var mp = {
gc : "Inside mp", // not a variable by itself, only a variable if used as mp.gc
funct : function(){
console.log( this.gc); //Calls "local" now
}
}
在本例中:
var mp = {
gc : "Inside mp",
funct : function(){
console.log( gc); //Calls global instead of local
}
}
var ft = function() {
gc = "Inside Function";
this.funct = function(){
console.log(gc);
}
}
您必须调用this.gc
,因为对象成员(键值对)不是变量,而是对象的成员
在本例中:
var mp = {
gc : "Inside mp",
funct : function(){
console.log( gc); //Calls global instead of local
}
}
var ft = function() {
gc = "Inside Function";
this.funct = function(){
console.log(gc);
}
}
gc
不是对象成员,并重写您设置的全局变量。因此,您可以只记录gc
并获得预期值
您还可以声明一个局部作用域变量:
var ft = function() {
var somethingLocal = "I am local";
this.funct = function(){
console.log(somethingLocal); // Calls locally declared variable
}
}
两个funct
s都引用相同的全局变量。您只需在ft()
中更改它的值。在ft
中,变量gc
没有在本地定义,它仍然引用全局变量,因为没有var
将gc
绑定到ft
函数的范围。不知道为什么要投-1票?在我看来,这似乎是一个真正的问题简短的回答:因为这不是一个简单的问题,这只是一个闭包行为。mp
是一个javascript对象,而不是JSON表示。这不仅是因为gc
和funct
没有双引号,还因为在JavaScript中,JSON始终是字符串。gc
不是在函数中本地定义的<代码>gc=“内部函数”
将全局gc
设置为内部函数“
,因为没有var
绑定到函数的作用域。gc
不是局部作用域,而是全局作用域。