做用域是指定义变量的区域。
做用域规定了如何查找变量,也就说当前代码对变量的查找权限。
1.全局做用域
全局做用域是最外围的一个环境,能够在代码中任何地方访问到。在浏览器中全局做用域就是window,所以在全局中声明的变量和方法就是window的属性和方法。 git
接下来咱们看个🌰github
var name = "global"; var num = 100; function test() { var inner_name = "test"; g_name = "global too"; console.log(name); //global console.log(num); //100 } console.log(inner_name); //inner_name is not defined console.log(g_name); //global too test();
从上面的例子中,咱们能看出全局声明的变量在哪里均可以访问到,咱们在test函数中建立了一个局部变量inner_name,想在外部访问它,可是结果报出一个没有声明的错误,因而可知外部环境不能访问内部环境的变量和函数。在函数test中有一个变量g_name,它没有用var进行声明,而且它能够在函数外部进行访问,这个变量拥有全局做用域,不声明就直接给变量赋值是一种错误的作法,应该避免。segmentfault
2.局部做用域
在局部做用域中,局部做用域与全局正好相反,局部做用域只能访问在固定的代码片断中访问到。局部做用域也就是函数做用域。浏览器
3.块做用域
在ES5中,是没有块级做用域这个概念的,举个例子:函数
for(var i=0;i<5;i++) { .... } console.log(i); //5
由上述例子可见,JS不一样于Java和C++的地方是没有块级做用域,在大括号以后依旧能够访问变量。为了解决这个问题,ES6引入了let、const两种声明的方法。这两种声明方法能够将{}变为块级做用域,看个例子。code
//let for(let i=0;i<5;i++) {} console.log(i); //i is not defined //const { const name = "const"; console.log(name); //const } console.log(name);//name is not defined
JS采用的是静态做用域,不是动态做用域。举个例子来讲明一下,看下面代码。作用域
var i = 10; function test() { console.log(i); //10 } function foo() { var i = 20; test(); } test();
静态做用域是在函数声明时决定的,动态做用域是在函数调用决定的。
——咱们能够假设一下,JS采用的是动态做用域,在test函数执行时,首先在test的函数中找i这个变量,没有找到因而去上一级做用域中查找,在foo函数中找到i这个变量,输出i应该获得20,可是获得的值是10。
——咱们再假设,JS采用的是静态做用域,在test函数执行时,在test函数中没有找到i这个变量因而去上一级做用域中查找,由于test是在全局做用域中声明的,因此上一级做用域也就是全局做用域。在全局变量找到了i这个变量,输出i的值是10。get
以上就是对JS做用域的基本理解,若有错误与缺失,请指正,谢谢。it
参考连接:io