练习题1:
var test = (function(i){
return function(){
alert(i*=2);
};
})(2);
test(5);
答案解析:
- EC(AN2)执行完毕,立即出栈释放,此时的EC(AN1)上下文中的0x001堆内存不再被占用,则EC(AN1)上下文出栈释放
练习题2:
var b = 10;
(function b() {
// b会在私有上下文中被声明 b -> ƒ 函数本身
b = 20; //此处的修改无效
console.log(b); //-> ƒ 函数本身
})();
console.log(b);
匿名函数具名化
- 「符合官方语法规范,推荐使用」:原本匿名函数没有名字,我们给其设置一个名字。
- @1 我们给匿名函数设置的名字,并不会在其所处的上下文中声明,所以在函数外面不可以使用这个名字进行相关的操作。
- @2 但是会在自己执行产生的私有上下文中声明这个函数名,存储的值是当前这个匿名函数本身。
- @3 并且默认是不支持把其值进行修改的「改了也没用」。
- @4 但是如果当前私有上下文中,也有基于其余的方式声明过这个名字,则以自己声明的为主「也就是@2这一步做的事情优先级最低」。
- 作用:可以实现匿名函数的递归处理、语法更规范、也无需担心会和外面的变量产生冲突。
练习题3:写一个函数,实现求100以内的数字之和。
var total = function total(num){
//方法一:
if(num == 1){
return num
}else{
return num + total(num-1);
// 此处也可以用 return num + arguments.callee(num-1);
}
//方法一可整合为: return num ==1? num:num+total(num-1) ; //三元运算符
}
- 通过闭包可以实现函数的递归调用。
- 不使用闭包可以在函数内部使用
arguments.callee()
调用函数本身。 arguments.callee
:可在函数内部调用函数本身,但是严格模式不支持,会报错。- 匿名函数一般命名为 anonymous(匿名的)。
练习题4:
var a = 9;
function fn() {
a = 0;
return function (b) {
return b + a++;
}
}
var f = fn();
console.log(f(5));
console.log(fn()(5));
console.log(f(5));
console.log(a);
答案解析:
: