JavaScript:请问同时声明多个变量的原理是什么?var a,b,c;

函数一:

<script>
    function show(){
        var a=b=c=d=5;
    }
    show();
    alert(a);//弹a时报错(not defined),而b、c、d都能弹出5
</script>

函数二:

<script>
    function show(){
        var a=5,b=6,c=7;
    }
    show();
    alert(c);//弹出a、b、c全都报错
</script>

**请问一下,为什么在函数一中,只有变量a被声明了;为什么在函数二中,变量a、b、c都都被声明了?难道是var的“声明范围”是与它最近的变量?
谢谢!**

阅读 21k
6 个回答
  1. 为什么在函数一中,只有变量a被声明?
    因为赋值是从右向左结合:
    var a=b=c=d=5; 等价于 var a=(b=(c=(d=5)));,其中只有a被声明了,b,c和d都是自动解析为全局变量了。

  2. 为什么在函数二中,变量a、b、c都都被声明了?
    语法就这样规定的:

概述
变量声明语句,声明一个变量并且可以同时初始化该变量。

语法
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
varnameN 变量名。变量名可以定义为任何合法标识符。 valueN 变量的初始化值。该值可以为任何合法表达式。

描述
变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理。使用var语句声明的变量的作用域是当前执行>位置的上下文:一个函数的内部(声明在函数内)或者全局(声明在函数外)。
....

参考:

  1. Assignment operators

  2. 运算符优先级

  3. var - JavaScript

补充 a 称为 函数show的局部变量
你在函数外是弹不出来的啦

简化上面的答案就是

    <script>
        function show(){
            var a=b=c=d=5;
        }
        show();
        alert(a);//弹a时报错(not defined),而b、c、d都能弹出5
    </script>

等同于
var a=5;
b=5;
c=5;
d=5;
a为局部变量,b,c,d为全局变量

简单来说就是变量作用域的问题。上面都详细说了。 为什么呢?JS就是这样定的啦

变量作用域,第一个是声明了a为局部变量,b,c,d全局变量,alert函数是绑定在window上的为全局函数,所以取不到a;第二个声明的全是局部变量,所以全部取不到。

js中的作用域链控制着变量的使用范围,局部变量只有2种,在函数中以Var声明的变量还有就是函数的参数,JS中如果声明变量没有使用var,无论在哪里声明都是全局变量,当函数调用完成,函数的活动对象被释放,所以返回undefined,而b,c,d没有使用var声明所以是全局可以访问到。

而第二个图是以连续声明的方式创建变量,所以都是局部变量。所以都会报错。

推荐问题
宣传栏