林秀栋的技术博客

函数提升和函数的跨级作用域

文章来源

由于 ES5 和 ES6 在函数提升和函数块级作用域上有巨大差异,所以这里以 ES6 + 浏览器环境为标准。

console.log(fn); // undefined
fn(); // 报错,fn is not a function
{
  fn(); // 10
  function fn() {
    console.log(10);
  }
  fn(); // 10
}
fn(); // 10

记住这三句(浏览器遵循的 es6 标准)

所以上面的函数相当于这样

var fn;
console.log(fn); // undefined
fn(); // 报错,fn is not a function
{
  fn = function () {
    console.log(10);
  };
  fn(); // 10
  fn(); // 10
}
fn(); // 10

前面讨论的一直都是:函数声明 + 浏览器环境

即,function xxx(){} 这种函数声明。而不是 var xxx = function(){} 这种函数表达式。前者,用本文的逻辑去考虑函数的提升和函数的块级作用域;后者,等价于变量的提升和变量的块级作用域。

如果换做严格模式下的 node 环境,那么将严格遵守 es6 标准:函数声明类似于 let。