javascript - JavaScript 变量提升行为
问题描述
我可能遗漏了一些非常基本的东西,但无论如何我都想问这个
var a=100;
function f(){
console.log(a)
const a=150
}
console.log(a)
f();
将 const a=150 更改为 var a=150 时打印 100 并引发错误,返回 100 且未定义。我不确定为什么会发生这种行为,任何指向相关信息的指针都值得赞赏
解决方案
一般来说,吊装是这样工作的:
- 变量的声明移到顶部
- 变量用一个特殊的“提升”值初始化
- 当程序到达该
var/let/const
行时,该变量将使用该行中提到的值重新初始化(或者undefined
如果没有)。
现在,您的示例可以简化为:
console.log(a)
let a = 150
这实际上是:
a = <hoisted value>
console.log(a)
a = 150
它会引发错误,因为对于let
和const
,提升的值是一个特殊对象,当您尝试访问它时会引发错误。
另一方面,提升的值为var
just undefined
,所以这将打印undefined
而不会引发错误:
console.log(a)
var a = 150
let/const
此外,关于提升哪些变量类型以及vars的所谓“死区”存在一些混淆(包括这个线程) 。这样想更简单:一切都被提升了,也就是说,块中的所有变量绑定都是在进入块之前创建的。var
和在这方面的唯一区别let/const
是,后者在使用值初始化之前不允许使用绑定。
有关更多详细信息,请参阅https://stackoverflow.com/a/31222689/989121。
推荐阅读
- deployment - 将代码部署到负载均衡器下的多台生产服务器,无需持续部署
- flutter - 在选择任何弹出项目之前,Flutter popupmenubutton 不会关闭
- python-3.x - 已安装 dbt 但出现错误“未找到 DBT 命令错误”
- r - 将相似的字符串分组并将它们的值更改为共同的值,同时保留各个行
- swift - UIStackView 仅在 iPhone SE Simulator 上进行裁剪和截断
- android - TikTok SDK登录如何获取用户信息?
- express - 在对模型进行更改后,我们是否应该使用 Sequelize 手动修改迁移文件?
- git - 有没有办法找出哪个用户在 Git 中重命名了一个分支?
- regex - IIS URL 重写:在 url 中只添加一次斜杠
- sql - SQL Server:删除4列匹配的重复项,但将具有特定值的列保留在另一列中