大厂基于匿名函数的面试题(其一)

648 阅读1分钟

需求:下面代码输出的结果是多少,为什么?如何改造一下,就能让其输出 20 10?

var b = 10;
(function b() {
    b = 20;
    console.log(b);//输出函数b本身
})();
console.log(b);//输出10
  • 按照常理,一般自执行函数都是匿名函数:但是我们可以给其设置为实名函数(具名函数),只不过及时设置了函数名,和平时普通的具名函数还是有区别的

1、匿名函数具名化之后,设置的函数名,只能在函数内部的上下文(作用域)中使用(和外界的变量没有关系),相当于当前私有上下文中的一个私有变量

(function func(){
    console.log(func);//输出当前函数func
})();
console.log(func);//报错:func is not defined

2、这个设置的函数名,不仅只能在私有上下文中使用,而且还不能修改其值(修改其值得代码在浏览器中无效,而且在严格模式下会报错)

(function func(){
    console.log(func);//输出当前函数func
    func = 100;//此代码无效(严格模式下报错)
    console.log(func);//输出当前函数func
})();
  • 如何实现:可以基于重新声明这个变量的方法,修改它的值(相当于我们自己声明的优先级会更高,告诉浏览器以我们自己声明的为主)
var b = 10;
(function b() {
    var b = 20;
    console.log(b);//输出20
})();
console.log(b);//输出10
  • 总结:此题解决办法并不难,一般基本都可以做出来,难的是知道其解决办法的原理!