JavaScript-变量的作用域面试题

块级作用域

-      在其他的语言中,任何一对花括号中的语句都属于一个块,在这之中定义的所有变量在代码块外是不可见的

-      JavaScript中没有块级作用域

1   //这里只有函数中定义的变量,才不能被外部访问
2   //这里的i和a变量,是可以在外面被访问的。
3    for(var i = 0;i<0;i++){
4     var a = 10;
5
6   }
7   

 

全局变量

-      定义在script或者不属于某个函数的变量

-  全局变量,可以在同一个文件中的两个Script代码使用

1 <script type="text/javascript">
2     var a=10;
3 </script>
4 <!--其他代码-->
5 <scripr type="text/javascript">
6     console.log(a);
7     //这里仍然可以输出a的值
8 <script>

 

局部变量

-      定义在函数内部的变量

其他

-      函数内部可以访问到该函数所属的外部作用域的变量(作用域链)

-      不使用var声明的变量是全局变量,不推荐使用。

注意:不使用var声明的变量,必须进行赋值,否则会提示变量不存在

1 function(){
2      a=1;
3      console.log(a);
4 }
5 //这里是违法的,因为a没赋值
6 function(){
7      console.log(a);
8 }

 

-      变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

JavaScript中预编译的问题

JavaScript在接收到script代码的时候,会先进行预处理,改变代码的顺序

-      把代码的声明提前

-      把函数的定义提前

例如下面的代码

 1 var num = 10;
 2 fun();
 3 function fun(){
 4      condole.log(“兔子只吃胡萝卜”);
 5 }
 6 //JavaScript预处理后
 7 var num;
 8 function fun(){
 9      condole.log(“兔子只吃胡萝卜”);
10 }
11 num = 10;
12 fun();

 

由此产生的面试题

1.输出的值是什么

 1 var num = 10;
 2 fun();
 3 function fun (){
 4      console.log(num);
 5      var num = 20;
 6 }
 7 //首先将其预编译
 8 var num;
 9 num = 1010 function fun (){
11 var num;
12      console.log(num);
13      num = 20;
14 }
15 fun();
16 //此时输出为undefined

 

2. 输出是什么

 1 var a = 18;
 2 f1();
 3 function f1(){
 4      var b=9;
 5 console.log(a);
 6      console.log(b);
 7      var a = ‘123’;
 8 }
 9 //预编译
10 var a;
11 a = 1812 function f1(){
13 var b;
14 var a;
15      b=916     console.log(a);
17      console.log(b);
18      a = ‘123’;
19 }
20 f1();
21 //输出结果
22 undefined
23 9

 

3. 输出什么

 1 //这里会牵扯到全部变量的定义,在函数中,如果没有用var定义的变量,是全局变量
 2 f1();
 3 console.log(c);
 4 console.log(b);
 5 console.log(a);
 6 function f1(){
 7      var a = b = c = 9;
 8      console.log(a);
 9     console.log(b);
10     console.log(c);
11 }
12 //预编译结果
13 var b;
14 var c;
15 function f1(){
16 var a;
17      a = b = c = 9;
18      console.log(a);
19     console.log(b);
20     console.log(c);
21 }
22 f1();
23 console.log(c);
24 console.log(b);
25 console.log(a);
26 //输出结果
27 9
28 9
29 9
30 9
31 9
32 Uncaught ReferenceError: a is not defined//变量未定义

 

posted @ 2016-10-16 18:52  兔子只吃胡萝卜  阅读(197)  评论(0编辑  收藏  举报