我在学习javascript,有人可以为我解释下面的代码片段吗?Javascript基本知识:可变范围
var state=true;
function bob(){ var state=false; }
bob()
什么应该是国家的价值,为什么?
非常感谢, 大号
我在学习javascript,有人可以为我解释下面的代码片段吗?Javascript基本知识:可变范围
var state=true;
function bob(){ var state=false; }
bob()
什么应该是国家的价值,为什么?
非常感谢, 大号
在执行结束时,state
将true
,因为函数bob()
定义了一个名为state
,而不是分配给同名的全局变量的局部变量。然而,在下面的例子中,state
是假的:
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
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
谢谢你的回答:) – lshettyl 2011-05-18 10:28:30
如果要值改变gloabl“状态”为假,执行以下操作(不(再)声明一个局部变量的鲍勃()功能):
var state=true;
function bob(){ state=false; }
bob()
状态将是:
false
哈,同一个答案几乎一样! :) – 2011-05-18 10:28:39
约ECMA-/ JavaScript的非常重要的事实是,我有只有功能范围。
这是我教任何人学习它的第一件事。 Javascript的另一个概念是范围链。这是用非常简短的话来说的,是一种保存在背景下的内部财产。每个函数都会创建一个(执行)-Context并将所有父上下文存储在其内部[[Scope]]属性中。现在,当你在一个函数中访问一个变量名时,Javascript解释器会尝试解析该变量。搜索开始于它自己的激活对象(另一件事,我将跳过这里的解释),如果发现搜索停止。如果在那里找不到变量,那么JavaScript会访问其[]的[[Scope]]属性,并从所有父范围词法(词法范围...)中搜索激活对象。
然后采取该变量的第一个匹配。如果变量名在scopechain中的任何地方都找不到,则返回undefined
。
现在在你的代码片段中,我们创建了两次变量state
。第一次,全局上下文将变量存储在它的变量对象(与激活对象相同,但是用于非函数上下文)。
第二次,我们在bob()
的执行上下文中创建了state
,并且Javascript将它存储在它的Activation对象中。因此,当我们在Bob
的上下文中访问state
时,其始终为false
,因为我们的解析查找过程在我们自己的Activation对象中开始。
如果我们访问的Bob
state
之外,我们只是会发现在来自全球范围内的变量对象 变量state
(实际上是全局对象本身)和它的true
那里。
对整个主题的更多和更精确的信息:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
如果你把它改成如下:
var state=true;
function bob(){ state=false; }
bob();
然后在执行结束,state
将false
。这是因为bob()
中的执行上下文将查找名称为state
的本地变量,它不会找到(在state
之前没有var
来声明新的局部变量),并且如果找不到它,它将移动到下一个词法上下文,它将在其中看到您的全局变量scope
,它将修改为false
。
得知,谢谢你:) – lshettyl 2011-05-18 10:27:55