一、作用域
想知道作用域,我们得先了解什么是执行上下文。
首先,通过一段小案例看看。
<script type="text/javascript">
console.log(a);
var a = 100;
fn('小明');
function fn(name){
age = 20;
console.log(name,age);
var age;
}
看看运行之后的效果图。
为什么?其实是这样,网页加载js文件的时候是从头开始的,当执行console打印语句时,找不到a,所以先赋值给undefined,然后全局找变量a包括函数体fn,将a提取出来,fn也提取出来。都提取出来之后,fn已经预加载了,所以fn(“小明”),就能够打印正常了。这就是执行上下文。
Javascript中的作用域的原则
无块级作用域
有函数作用域和全局作用域
无块级作用域
比如JAVA中,
if(name=="小明"){
int a = 100;
}
System.out.pritln(a);//出错!XXXX 无法打印出a的值
而javascript中则可以
if(name=="小明"){
var a = 100;
}
console.log(a) //成功打印
这就是javascript和java的区别。
函数作用域和全局作用域
比如这段代码
var a = 100;
function fn(){
var a = 50;
console.log(a); //输出的是50
}
console.log(a); //输出的是100
函数作用域的意思就是某一个变量的只限定在特定函数体内,比如fn()这个函数体内。
全局作用域指的是,定义一个变量a,谁都能够访问到同名的变量a,最大的缺点就是,谁都能任意覆盖a的值。比如,在其它空白区域重新定义变量a,var a = 1000; 那么a就被覆盖成了1000。变量a数据容易被污染。
二、闭包
闭包的概念
一个函数能够访问其它函数内部的变量。举个例子:
function outer(){
var a = 100;
return function(){
return a;
}
}
var func = new outer();
func();//100
从上述代码可知,外部有一个函数outer(),outer()里有一个匿名函数,而匿名函数中却没有变量a,可是最后却能够成功打印变量a的值,所以这就是闭包。