前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS的 if 中的函数声明提升

JS的 if 中的函数声明提升

作者头像
治电小白菜
发布2020-08-25 15:58:40
3.7K0
发布2020-08-25 15:58:40
举报
文章被收录于专栏:技术综合技术综合

问题

可以先看看下面的例子,

代码语言:javascript
复制
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值进行修改


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

代码语言:javascript
复制
var a
if (true) {
  console.log(a, window.a)
  a = 1
  a = function () {}
  a = 5
  console.log(a)
}
console.log(a)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档