javascript - js函数提升问题?

查看:77
本文介绍了javascript - js函数提升问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

foo();
if (true) {
  function foo() {
    console.log('1111');
  }
} else {
    function foo() {
      console.log('22222');
  }
}

在我理解之中,函数提升应该会忽视if和else的大括号,然后第二个foo覆盖第一个foo,最后打印222的么?
为什么报错了

解决方案

ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

foo();
if (true) {
  function foo() {
    console.log('1111');
  }
} else {
    function foo() {
      console.log('22222');
  }
}

你的代码如果在es5的环境下运行,就是你说的情况,但是在es6浏览器中为了兼容也做了如下如下规定(只在es6浏览器中)

  • 允许在块级作用域内声明函数。
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
  • 同时,函数声明还会提升到所在的块级作用域的头部

所以浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量
因此你的代码相当于

foo();
var foo = undefined
if (true) {
  function foo() {
    console.log('1111');
  }
} else {
    function foo() {
      console.log('22222');
  }
}

应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句

这篇关于javascript - js函数提升问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆