JavaScript - 闭包的经典练习题1

练习题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);

答案解析:请添加图片描述
:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值