作用域
js中有全局作⽤域、函数作⽤域,es6中⼜增加了块级作⽤域。作⽤域的最⼤⽤途就是隔离变量或函数,并控制他们的⽣命周期。
作用域是在函数执行上下文创建时定义好的,不是函数执行时定义的。
举个栗⼦
function a () {
return function b() {
var myname = 'b';
console.log(myname); // b
}
}
function c() {
var myname = 'c';
b();
}
var b = a();
c();
// 去掉函数b中的myname声明后
function a () {
return function b() {
// var myname = 'b';
console.log(myname); // 这⾥会报错
}
}
function c() {
var myname = 'c';
b();
}
var b = a();
c();
作用域链
当⼀个块或函数嵌套在另⼀个块或函数中时,就发⽣了作⽤域的嵌套。在当前函数中如果js引擎⽆法找 到某个变量,就会往上⼀级嵌套的作⽤域中去寻找,直到找到该变量或抵达全局作⽤域,这样的链式关系就称为作⽤域链(Scope Chain)
闭包
⾼级程序设计三中:闭包是指有权访问另外⼀个函数作⽤域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)