理解JavaScript做用域

1.什么是做用域?

做用域是指定义变量的区域。

2.做用域有什么做用?

做用域规定了如何查找变量,也就说当前代码对变量的查找权限。

3.JS中有几种做用域?

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

4.动态做用域和静态做用域

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

相关文章
相关标签/搜索