JavaScript作用域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript作用域相关的知识,希望对你有一定的参考价值。

1.JS的作用域分为全局作用域和函数作用域

全局作用域内定义的变量可以在全局和函数体内访问,函数作用域内定义的变量只能在自己的函数作用域内访问。如果变量前没有加var,无论在哪定义都会成为全局变量。

 1 //全局作用域
 2 var globalVal = "global";  //全局变量
 3 
 4 (function func (){
 5     //函数作用域
 6     var localVal = "local";
 7     globalVal2 = "global too";
 8     
 9     alert(globalVal);        //global
10     
11 })();
12 
13 alert(localVal);             //localVal is not defined
14 alert(globalVal2);           //global too 

上面代码中的函数为立即执行函数,不经过调用就会自己执行,方便看测试结果,另一个重要作用稍后解释。

另外,13行处报错not defined和JS的undefined类型是完全不同的两个概念。前者表示这个变量没有声明过,是不存在的或者不在可访问的作用域内,程序会产生运行时错误并终止运行;后者是JS的基本数据类型,表示此变量声明过,但未被定义,或被赋值为undefined,这个值可以显示、比较、运算,不会报错。

2.JS没有块级作用域

C++、Java等语言都有块级作用域,如for循环while循环等,JS却是没有块级作用域的!

1 for(var i=0;i<3;i++)
2 {    
3     alert(i);  //0,1,2 
4 } 
5 alert(i);      //3

上面5行代码处i的值是3,也就是说 var i; 写在for的里面和外面效果是一样的。C++之所以无法在for结束之后访问到i,是因为在一个块级作用域执行完它的垃圾回收机制就启动了,把块级作用域内不用的变量释放了。

3.构造函数创建函数的作用域是全局

 1 var globalVal = "global"; 
 2 
 3 (function func (){
 4     //函数作用域
 5     var localVal = "local";
 6     
 7     var func2 = new Function("alert(globalVal)");
 8     var func3 = new Function("alert(localVal)");  
 9     func2();    //global
10     func3();    //localVal is not defined
11 })();
12 
13 func2();        //func2 is not defined

上面代码显示,由构造函数创建的函数可以访问到全局变量globalVal,但访问不到局部变量localVal。第13行可能产生误解,new Function创建的函数作用域是全局的,把它赋值给局部变量func2,外部访问func2时未定义是正常的。

4.使用立即执行函数创建函数作用域

如1节所示,使用立即执行函数很大的用处是创建函数作用域,避免产生全局变量,因为全局变量重名可能产生覆盖等一些难以排查的问题。

以上是关于JavaScript作用域的主要内容,如果未能解决你的问题,请参考以下文章

JS---闭包

JS 作用域及作用域链

JS 作用域及作用域链

JavaScript ES6 的let和const

Javascript代码片段在drupal中不起作用

初入AngularJS基础门