javascript - JavaScript 提升 - 内存创建阶段后提升的代码
问题描述
我正在阅读凯尔辛普森的书:https ://github.com/getify/You-Dont-Know-JS/blob/1st-ed/scope%20%26%20closures/ch4.md#functions-first 。
但我不完全理解这一行“注意 var foo 是重复的(因此被忽略)声明,即使它出现在函数 foo()... 声明之前,因为函数声明在普通变量之前被提升。”
假设这是代码:
console.log(foo); // The output is: foo() { return 2; }
function foo() {
return 1;
}
function foo() {
return 2;
}
var foo = 3;
我想可视化在内存创建阶段之后 JS 引擎中的输出。会是这样吗?
function foo() {
return 2;
}
console.log(foo);
如果是,为什么var foo = 3;
被忽略?片段中没有重复的 for var
。如果没有,任何人都可以帮我想象一下在内存创建阶段之后 JS 引擎的输出是什么?
谢谢
解决方案
- 函数声明
- 声明一个与函数同名的变量(这是提升的)
- 将函数分配给该变量(已提升)
var
具有关联赋值的语句- 声明一个具有该名称的变量(这是提升的)
- 将值分配给该变量(未提升)
var foo = 3
不被忽视。
变量声明 ( var foo
) 被忽略,因为之前的函数声明已经声明了该变量。(即因为它重复了 的声明foo
)。
foo = 3
不会被忽略并分配3
给foo
……它只是在您的console.log
语句运行后才这样做,因为它没有被托管。
推荐阅读
- javascript - 我想知道如何在 jsp servlet web 项目上使用 ajax 和 jquery 获得响应和发布响应
- javascript - 如何使用 passport.js 将来自 React 客户端的数据传递到 Oauth2.0 Google 策略流中
- java - Java:数学测验缺少返回语句?
- vba - Visual Basic 代码提前结束
- node.js - 子进程是立即执行,还是在事件循环的未来迭代中执行?
- ios - iOS 11 上的 WKWebView 是否支持 .heic 图像?
- android - Android Socket 每 20 秒卡住一次
- android - 如何从 kotlin 获取用 xml 编写的“PathInterpolator”
- r - 使用 dplyr/tidyverse 进行类似扫描的操作
- c++ - 如何使用 C++ 检查 Lua 中是否存在预加载的模块