2011-05-18 35 views
3

我在学习javascript,有人可以为我解释下面的代码片段吗?Javascript基本知识:可变范围

 

var state=true; 
function bob(){ var state=false; } 
bob() 
 

什么应该是国家的价值,为什么?

非常感谢, 大号

回答

3

在执行结束时,statetrue,因为函数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 
+1

得知,谢谢你:) – lshettyl 2011-05-18 10:27:55

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 
+0

谢谢你的回答:) – lshettyl 2011-05-18 10:28:30

0

如果要值改变gloabl“状态”为假,执行以下操作(不(再)声明一个局部变量的鲍勃()功能):

var state=true; 
function bob(){ state=false; } 
bob() 

状态将是:

false 
+0

哈,同一个答案几乎一样! :) – 2011-05-18 10:28:39

1

约ECMA-/ JavaScript的非常重要的事实是,我有只有功能范围

这是我教任何人学习它的第一件事。 Javascript的另一个概念是范围链。这是用非常简短的话来说的,是一种保存在背景下的内部财产。每个函数都会创建一个(执行)-Context并将所有父上下文存储在其内部[[Scope]]属性中。现在,当你在一个函数中访问一个变量名时,Javascript解释器会尝试解析该变量。搜索开始于它自己的激活对象(另一件事,我将跳过这里的解释),如果发现搜索停止。如果在那里找不到变量,那么JavaScript会访问其[]的[[Scope]]属性,并从所有父范围词法(词法范围...)中搜索激活对象。

然后采取该变量的第一个匹配。如果变量名在scopechain中的任何地方都找不到,则返回undefined

现在在你的代码片段中,我们创建了两次变量state。第一次,全局上下文将变量存储在它的变量对象(与激活对象相同,但是用于非函数上下文)。

第二次,我们在bob()的执行上下文中创建了state,并且Javascript将它存储在它的Activation对象中。因此,当我们在Bob的上下文中访问state时,其始终为false,因为我们的解析查找过程在我们自己的Activation对象中开始。

如果我们访问的Bobstate之外,我们只是会发现在来自全球范围内的变量对象 变量state(实际上是全局对象本身)和它的true那里。


对整个主题的更多和更精确的信息:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

0

如果你把它改成如下:

var state=true; 
function bob(){ state=false; } 
bob(); 

然后在执行结束,statefalse 。这是因为bob()中的执行上下文将查找名称为state的本地变量,它不会找到(在state之前没有var来声明新的局部变量),并且如果找不到它,它将移动到下一个词法上下文,它将在其中看到您的全局变量scope,它将修改为false