- 函数内部可以访问全局变量
let a = 0;
function test(){
console.log(a);
}
test(); //0
- 函数外部不能访问函数内的变量
function test(){
let a = 0;
}
console.log(a); //"ReferenceError: a is not defined
作用域链:父对象的所有变量,对子对象都是可见的,反之不成立
function f1(){
let n=1;
function f2(){
console.log(++n);
}
f2();
}
f1(); //2
f1(); //2
函数f2
定义在函数f1
内部,根据作用域链,f2
可以读取f1
中的所有局部变量,那么只要把f2
作为返回值,我们就可以在f1
外部读取f1
的内部变量
function f1(){
let n=1;
function f2(){
console.log(++n);
}
return f2;
}
let result=f1();
result(); // 2
result(); // 3
闭包的概念
JS闭包是指有权访问一个函数内部变量的函数,创建闭包的常见方式是在函数内部定义一个函数
用途:
- 读取函数内部的局部变量
- 变量的值保存在内存中,不会被垃圾回收机制回收
注意:
- 消耗内存,在IE可能导致内存泄露
经典例题:
window.onload = function(){
let aLi = document.getElementsByTagName('li');
for (var i=0;i<aLi.length;i++){
(function(i){
aLi[i].onclick = function(){
alert(i);
};
})(i);
}
}
<ul>
<li>123</li>
<li>456</li>
<li>789</li>
</ul>
参考文章推荐:
详解js闭包
学习Javascript闭包