好吧那我接下来在从新记录下闭包吧:git
其余时效优质文章,欢迎 ❤️ Blog 🌟github
在计算机中,闭包指引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在。bash
局限自定义: 在Javascript 中子函数使用了其父函数或者外层函数的变量就产生了一个闭包。这时外层变量的值能被子函数使用且外层变量在子函数未销毁以前一直被分配不会被释放。闭包
闭包的产生因为变量做用域链引发的(由词法做用域致使)。函数
在ES5及以前的语言规范中做用域分3种:ui
在函数中定义的变量,就属于局部做用域,且只对函数范围内其余表达式可见。 而函数内部又可使用父函数中的变量这就是因为做用域链,当JavaScript查找与变量关联的值时,会遵循一个查找链。这个链是基于做用域的层次结构。 以下代码:spa
var a = "global variable";
( function () {
console.log(a);
var fn = function () {
var a = "local variable"
console.log(a);
}
fn();
})()
//输出
//global variable
//local variable
复制代码
咱们在window
全局对象下声明了变量a
,随后调用了一个当即执行函数,其中向控制台直接打印变量a,因为当即执行函数没有声明局部变量a因此致使JavaScript向其做用域链继续查找接着就在window
对象中找到a
变量并打印出它的值"global variable"。接着这个当即执行函数声明了一个局部函数变量再调用它,在这个函数变量中首先声明了一个局部变量a
而后在向控制台输出a
得值。JavaScript在执行时因为在fn函数做用域内部查找到了变量a
就直接使用变量a
的值因此打印出了local variable。code
值得注意的是:对象
window
对象和当即执行函数所建立的闭包;另外一个是当即执行函数和其内部声明的函数变量fn建立的闭包。清楚做用域的含义了吗???索引
那么咱们刚刚说的“词法“做用域又是什么。 其实词法就是指代环境:因为函数决定做用域,而且函数是一等公民能够直接用来参数传递等。那么做用域链是怎样来肯定的呢: 下面的话背熟了: 做用域链是根据函数定义时候的位置肯定的而不是在调用时。--这就是“词法”做用域
若是你还不懂闭包我TM。。。
var liListlength = 3;
for(var i=0;i<liListlength;i++){
var ele=document.querySelectorAll(".test > li")[i];
ele.addEventListener("click",function(){
alert("index is :" + i);
})
}
var liListlength = 3;
for(var i=0;i<liListlength;i++){
var ele=document.querySelectorAll(".test > li")[i];
ele.addEventListener("click",(function(i){
return function(){
alert("index is :" + i);
}
})(i))
}
复制代码
var countMoudle = (function(){
var _count = 0;
var plus = function(){
_count++;
};
var minus = function(){
_count--;
};
var print = function(){
console.log(_count);
}
return {
plus: plus,
minus: minus,
print: print
};
})();
countMoudle.print() //0
countMoudle.plus()
countMoudle.print() //1
countMoudle.minus()
countMoudle.print() //0
复制代码
此时咱们只暴露出了方法名而没有暴露出变量属性,这时要对变量的修改只有经过接口方法调用。