一、深入之作用域(Scope)
2017-06-06 本文已影响0人
七_五
0x00、引言
在编程语言中,Scope控制着变量与参数的可见性及生命周期。对于写代码的我们而言也是一项重要的服务,它减少了名称冲突并提供了自动内存管理。
JavaScript中的作用域分为全局作用域和函数作用域两种
0x01、函数作用域
函数作用域: 即定义在函数中的参数和变量在函数外部是不可见的。而在函数内部位置定义的变量,在该函数内部任何地方都可见,千万注意不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!
demo
var foo = function {
var a =3 , b=5;
var bar = function(){
var b = 7, c = 11 //此时a =3 ,b =7 ,c =11
a += b + c; //此时 a= 21,b = 7,c = 11
};
//bar()函数调用前:a =3,b=5,c为undefined
bar();
//bar()函数调用后:a = 21,b =5(若块级作用域,此刻a应该为3)
}
0x02、ES6新增块级作用域
我们知道在大多数类C语言中都拥有块级作用域。通常在一个 代码块{....}中,定义的所有变量在代码块外部是不可见的;定义在代码块中的变量在代码块执行结束后会被释放掉,这是一个很优雅的特性。
demo
{
let a = 7
var b = 5
}
console.log(a) // a is not defined
console.log(b) // 5
出现上面的结果,是因为var定义的变量不受块级作用域的约束(这里可以看作全局变量),因此打印出b=5;而let是受的块级作用域约束的,在{...}中所有变量在代码块的外部不可见
下面我们来聊一下ES6中let和const的区别:其实简单的说,就是let主要是用来定义变量的,而const用于定于常量(定义时必须立即赋值,并不可被覆盖),当然它们同样在遵循块级作用域。
0x03、总结
其实我们需要重点注意的是函数作用域与块级作用域的区别,并且对函数作用域需要关注的是:内部函数可以自由访问定义它们的外部函数的参数和变量,这也为我们的闭包奠定了基础