美文网首页
JS的 if 中的函数声明提升

JS的 if 中的函数声明提升

作者: ZZES_ZCDC | 来源:发表于2020-04-05 17:32 被阅读0次

问题

可以先看看下面的例子,

console.log(a)
if (true) {
  a = 1
  function a () {}
  a = 5
  console.log(a)
}
console.log(a)

在开发者工具里可以看到打印出来的值为 undefined 5 1

可以看到, 给a赋值的5, 并没有赋值到全局变量a

解决

先看看MDN里的说明

从ES6开始
严格模式下,块里的函数作用域为这个块。ES6之前不建议块级函数在严格模式下使用.
在ES6非严格模式下, 块中函数声明会出现提升, 所以最好使用函数表达式来定义函数


走走流程看看到底发生了啥

我们可以先把, function a () {}注释掉, 可以看到报错了, Uncaught ReferenceError: a is not defined, 所以if里的函数声明确实存在变量提升

然后, 我们可以打点调试一下
在if 中的a=1语句之前, 我们可以看到函数声明已经提升了, 此时if作用域里a为函数


而全局的a还是undefined

a=1后, 可以看到, 全局的a依然是undefined, 而块级作用域里, a的值为1

在运行到 function a () {} 后, 我们可以看到, 块级作用域的a的值会赋值给全局作用域的a

随后运行a=5, 则只是在块级作用域里的赋值, 不会对全局作用域的a值进行修改

当然, 如果使用函数表达式来声明函数的话, 可以避免

var a
if (true) {
  console.log(a, window.a)
  a = 1
  a = function () {}
  a = 5
  console.log(a)
}
console.log(a)

相关文章

  • js中变量和函数声明的提升

    二 、 js中变量和函数声明的提升

  • js面试题

    1、js 数据类型 基本数据类型 引用数据类型 2、js 变量和函数声明的提升 在js中变量和函数的声明会提升到最...

  • JS笔记 命名问题

    JS中函数和变量重名时,后声明的覆盖先声明的,后赋值的覆盖先赋值的。 变量提升和函数提升时,变量的声明是在函数的声...

  • JS的 if 中的函数声明提升

    问题 可以先看看下面的例子, 在开发者工具里可以看到打印出来的值为 undefined 5 1 可以看到, 给a赋...

  • 浏览器学习笔记-JS执行

    变量提升 变量提升原理浏览器对js是先编译后执行,在编译过程中,js中的变量声明会被提升到代码段落前面。函数声明和...

  • js变量声明提升与函数表达式

    1.变量声明提升 js引擎会把变量声明与函数声明都提升到当前函数的顶部。eg: js引擎编译为 2.函数表达式 对...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 猫眼

    var变量提升,函数声明提升,消除变量声明提升(let); 高阶函数,函数式的编程,柯里化 原型链继承,js面向对...

  • JavaScript 函数声明与函数表达式的区别

    函数声明 存在函数提升(同比于变量提升) 函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪...

  • JavaScript中函数声明提升

    运行结果:(chrome 54.0+、IE11) js中变量声明和函数声明会在解析的时候提升【参考MDN变量提升】...

网友评论

      本文标题:JS的 if 中的函数声明提升

      本文链接:https://www.haomeiwen.com/subject/teouphtx.html