可变范围问题

时间:2011-08-26 15:24:03

标签: javascript

由于我是一名JavaScript新手,我开始学习它,但我刚刚开始时遇到困难。 我正在关注a Mozilla Tutorial,我在JavaScript中有可变范围的问题。我有一些代码:

var myvar = "my value";

var zmienna = "string";

(function () {
    alert(myvar);
    alert(zmienna);
})();

(function () {
    alert(myvar); // undefined
    var myvar = "local value";
    alert(zmienna);
})();

在本教程中,我已经读过JavaScript函数块中看不到的JavaScript变量。好吧,前两个警报说正确的值。这很奇怪,因为第三个警报说“未定义”,尽管事实上从前一个功能块没有任何改变。第四个,再次印刷正确的价值。

有人可以解释一下,这里发生了什么?我会很高兴,因为教程没有更多关于这一点。

2 个答案:

答案 0 :(得分:9)

暂停使用var

由于函数内部有var myvar,因此存在本地作用域myvar。由于您在发出警报后为其指定了值,因此当您发出警报时,该值为undefined

答案 1 :(得分:1)

  

“我读过从功能块看不到JavaScript变量。”

那不太对劲。它们可以从嵌套函数中获得。

嵌套函数创建范围链。在另一个函数内创建的函数可以访问它自己的变量以及它嵌套的函数的变量。

但是函数A如果函数A没有嵌套在 函数B中,则可以看到函数B的变量。

var myvar = "my value"; // <-- global variable, seen by all functions    
var zmienna = "string"; // <-- global variable, seen by all functions

(function () {
    alert(myvar);    // <-- referencing the global variable
    alert(zmienna);  // <-- referencing the global variable
})();
(function () {
    // v--- Declaration of these "local" variables were hoisted to the top...
    // var myvar;    // <--- ...as though it was here.
    // var new_var;  // <--- ...as though it was here.

    alert(myvar); // undefined (myvar is delcared, but not initialized)
    alert(new_var); // undefined (new_var is delcared, but not initialized)

    var myvar = "local value"; // <-- assign the value

    alert(zmienna);  // <-- referencing the global variable
    alert(myvar);  // <-- referencing the local variable

    var new_var = "test";  // <-- another new local variable

    // A nested function. It has access to the variables in its scope chain.
     (function() {
         alert(myvar);  // <-- referencing the variable from its parent func
         alert(new_var);  // <-- referencing the variable from its parent func
     })();
})();
/* 
Here's a new function. It was not nested inside the previous function, so it
   has access to the global variables, and not the locals of the previous func
*/
(function () {
    alert(myvar);    // <-- referencing the global variable
    alert(new_var);  // <-- ReferenceError
})();