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 = 10; 10 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 = 18; 12 function f1(){ 13 var b; 14 var a; 15 b=9; 16 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//变量未定义