我正在学习javascript,有人可以为我解释下面的代码片段吗?
var state=true;
function bob(){ var state=false; }
bob()
州的价值应该是什么?为什么?
非常感谢, →
答案 0 :(得分:3)
在执行结束时,state
将为true
,因为函数bob()
定义了一个名为state
的局部变量,而不是分配给它的全局变量名称。但是,在以下示例中,state
将为false:
var state=true;
function bob(){ state=false; }
bob();
通过省略var
关键字,JavaScript引擎将在范围链中向上移动,寻找名为state
的变量,直到找到一个或到达全局范围。这可以通过嵌套函数进一步证明:
var state = true; // global
function bob() {
var state = true; // local to `bob()`
function jim() {
state = false;
}
jim();
alert(state); //-> false, `jim()` modifies `bob()`'s variable
}
bob();
alert(state); //-> true, `jim()` and `bob()` don't touch the global variable
答案 1 :(得分:1)
关于ECMA- / Javascript非常重要的事实是,只有功能范围。
这是我教任何人学习它的第一件事。 Javascript的另一个概念是范围链。这是一个非常简短的词,一个保存在上下文中的内部属性。每个函数都创建一个(执行)-Context并将所有父上下文存储在其内部[[Scope]]属性中。现在,当您在函数中访问变量名时,Javascript解释器会尝试解析该变量。搜索从它自己的激活对象开始(另一件事,我将跳过此处的解释),如果发现搜索停止。如果无法在那里找到变量,Javascript将访问其 [[Scope]] 属性并从所有父作用域词法(词法范围...)中搜索Activation对象。
然后获取该变量的第一个匹配项。如果无法在 scopechain 中的任何位置找到变量名,则会返回undefined
。
现在,在您的代码段中,我们将创建变量state
两次。第一次,全局上下文将变量存储在其变量对象中(与Activation对象相同,但对于非Function上下文)。
第二次,我们在state
的执行上下文中创建bob()
,Javascript将其存储在Activation对象中。因此,当我们在state
的上下文中访问Bob
时,它总是false
,因为我们的解析查找过程始于我们自己的Activation对象。
如果我们在state
之外访问Bob
,我们就会在Variable对象中找到变量state
来自全局上下文(实际上是全局对象本身),它是true
那里。
关于整个主题的更准确的信息:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
答案 2 :(得分:0)
var state=true; //global scope variable called 'state' => true
function bob(){
var state=false; //local scope variable called 'state' => false, no global 'state' overwritten
//state = false; would overwrite global 'state'
}
bob(); //call function
//global 'state' remains true
答案 3 :(得分:0)
如果要将全局“state”值更改为false,请执行以下操作(不(重新)声明bob()函数的局部变量):
var state=true;
function bob(){ state=false; }
bob()
状态将是:
false
答案 4 :(得分:0)
如果您将其更改为以下内容:
var state=true;
function bob(){ state=false; }
bob();
然后在执行结束时,state
将为false
。这是因为bob()
内的执行上下文将查找名为state
的局部变量,它将找不到它(var
之前没有state
来声明新的局部变量如果找不到它,它将向上移动到下一个词汇上下文,它将看到你的全局变量scope
,它将修改为false
。
答案 5 :(得分:0)
当我们声明state = true时。这是全球范围。 在内部函数中,我们正在更改状态值。因此,我们正在改变全球范围的价值。因此,更改后,全局值将始终为false。