文章中说过函数自调用就是
var para = (function(){ alert(1); })(); //定义时已经执行一次,打印原文中的add()会发现alert(1)只会出现一次
同样还有:
+/~/-/!function(){
alert(2);
}();
;(function defend(){
alert(3);
}());
add实际以子函数声明内容在运行:于是 add拿到的是里面的子函数(取别名f2,内容如下),也不是counter++这个表达式,实践后发现是否return无关紧要,而且文章中连续执行了三次add(),只有函数才能被()执行,counter++只是逻辑而已;
//原文示例:
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
add();
add();
add();
//子闭包内容
var f2 = function(){ //这个声明内容被实际赋值给add
counter ++;
//return counter++; //有人说返回的是counter++,实际不用return结果依旧成立,送已不是表达式被赋值
}
counter始终存在:var add表明add是一个全局变量,不会被无缘无故销毁,add()在执行的时候就是f2()在执行。这导致f2也被存在内存中,从而其依赖的父函数及其变量无法被销毁。每次运行都会更新counter的值。
f2可以获得父级变量:子函数f2的变量counter是在父函数中被定义的(只执行过一次),在内部变量找不到就会向上级作用域寻找,这个查找的过程就叫作用域链(如果上级找不到,就会继续往更上级对象的作用域查找)。就像原文说的,支持嵌套,并且支持访问上一层的函数变量。
f2被赋给add,在访问自己及其上级的作用域,就是在外部调用内部变量的过程。
发表评论 取消回复