2018年4月前端面试时未正确解答的问题

136 阅读1分钟

1、立即调用函数表达式(IIFE)

在函数内部,IIFE表达式为接受的每一个变量i都创建了一个副本并存储为变量value。这个变量的值就是相应迭代创建的函数所使用的值,因此调用每个函数都会像从0-9循环一样得到期望的值。let和const提供的块级绑定让我们无须再这么折腾

// 在循环中使用立即调用函数表达式,以强制生成计数器变量的副本
var funcs = [];
for (var i = 0; i < 10; i++) {
    funcs.push((function(value) {
        return function() {
            console.log(value)
        }
    }(i)))
}

funcs.forEach(function(func) {
    func(); //输出0, 然后是1、2,直到9
})

2、let和const与var在全局作用域中的行为

  • 当var被作用于全局作用域时,它会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)
  • 这意味着用var很可能会无意中覆盖一个已经存在的全局变量
  • 如果在全局作用域中使用let或const,会在全局作用域下创建一个新的绑定,但该绑定不会添加为全局变量的属性
  • 如果不想为全局对象创建属性,则使用let和const会安全很多
let {log} = console
var RegExp = "Hello";
log (window.RegExp); // "hello"