ECMAScriptJS的变量作用域浅谈

 作为前端小白,总是针对JS的作用域有点晕,这里小研究了一下享受下,希望以及自家同的小白可以学的一些

 

第一是一个藏的例证:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
    a = 2
    if (true) {
    b = 3;
}}
console.log(a,b);     //2 3 

 这里肯定输出2,3    但是咱添加var后结果仍会如此:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
    var a = 2
    if (true) {
    var b = 3;
}}
console.log(a,b,i);    //输出 2 3 10

  这里虽异常为难了,很多新家还见面作这种病症,以为于里添加var就是局部变量,其实以
for 和 if
中但是因非用var关键字,因为ECMAScript不存块级作用域,因此循环之中的变量可以以异地访问到。

  值得一提的是ES6补偿加了let这等同特色,使得她定义的变量被界定在了一定范围外才会采用,而离这个限制虽然不行。

  如下:

1 var a=0,b=0,i=0;
2 for (let i = 0; i < 10; i++) {
3     let a = 2
4     if (true) {
5     let b = 3;
6 }}
7 console.log(a,b,i);    //0 0 0

 

  现在咱们再来拘禁函数和参数的作用域: 

 1 var a=0,b=1;
 2 function x(a,b){
 3         arguments[0]=100;
 4         window.b=222;
 5         b=333;
 6         c=99;
 7         console.log(a,b,c);    //100 333 99
 8 }
 9 x(a,b);
10 console.log(a,b,c);        //0 222 99

 

  ECMAScript中装有参数都是依值传递的,也就是说把函数外部的值赋给内部的参数,而且参数只能按值传递,你可管函数的参数想象变为有变量。

 

  我们拿a,b两个变量传递给函数的参数,然后以第3实行改变第一只参数的价值,在第4履行使用window改变全局变量b的价,显然函数内部参数的改观无法影响到全局变量。

但是当第6履我们赋值时未尝采用主要字var,于是函数调用完后,这个变量c
被补加到了全局环境下。 

  ECMAScript在编制JS代码中,不声明直接初始化变量很糟糕,这样发生或导致意外,所以建议在初始化前肯定要是优先声明。