Javascript基础:变量范围

时间:2011-05-18 10:21:06

标签: javascript

我正在学习javascript,有人可以为我解释下面的代码片段吗?


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

州的价值应该是什么?为什么?

非常感谢, →

6 个答案:

答案 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。