作用域
定义:程序中定义的变量所作用的范围。也就是说我定义了一个变量,我在哪个范围内可以使用,这个范围就是常说的作用域。
作用域一本分为全局作用域和局部作用域。
全局作用域在全局和局部都可以访问到,
局部作用域只能在局部被访问到
代码演示如下:
var num=100;
function a(){
console.log("局部---------start");
var a_num=1;
console.log(a_num);
console.log(num);
console.log("局部---------start");
}
console.log(num);
a();
console.log(a_num);
在页面上的运行效果如下:
在上面可以看到定义了全局变量num,num在函数a()和全局都是可以调用的,而在a中定义的a_num,只有在调用a函数时才会显示,而在a函数外调用a_num会报错not defind (未定义的)
闭包
定义:闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
相对作用域而言比较的理解复杂点,下面写一段代码大家看下。
var num=100;
function a(){
var a_num=1;
console.log(a_num);
function b(){
var b_num=2;
console.log(a_num);
console.log(b_num);
}
console.log(num);
return b;
}
var result=a();
result();
下面的效果不是重点,我们来分析下怎么才能构成闭包
定义a | 知道num |
---|---|
运行a | 知道 num 以及定义a_num和b函数 |
定义b | 知道 num 以及定义a_num |
运行b | 知道 num 和a_num以及定义了b_num |
return b返回的是b的地址,如果仅仅只调用a函数是没有办法获取b_num的
而通过令var result=a();result();就可以输出b_num的值,从而构成了闭包
在页面上的运行效果如下:
大家如果想进一步了解作用域,下面的网址中有更加总结的说法