校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > js语言和框架 > 语法相关-操作符相关
题目

下面代码的输出是什么?

function sayHi() {
console.log(name);
console.log(age);
var name = "Lydia";
let age = 21;
}

sayHi();


A. Lydia 和 undefined

B. Lydia 和 ReferenceError

C.ReferenceError 和 21

D.undefined 和 ReferenceError

解答

正确答案是 D

在函数中,我们首先使用var关键字声明了name变量。 这意味着变量在创建阶段会被提升(JavaScript会在创建变量创建阶段为其分配内存空间),默认值为undefined,直到我们实际执行到使用该变量的行。 我们还没有为name变量赋值,所以它仍然保持undefined的值。

使用let关键字(和const)声明的变量也会存在变量提升,但与var不同,初始化没有被提升。 在我们声明(初始化)它们之前,它们是不可访问的。 这被称为“暂时死区”。 当我们在声明变量之前尝试访问变量时,JavaScript会抛出一个ReferenceError。

译者注:

关于let的是否存在变量提升,我们何以用下面的例子来验证:

let name = 'ConardLi'
{
console.log(name) // Uncaught ReferenceError: name is not defined
let name = 'code秘密花园'
}

let变量如果不存在变量提升,console.log(name)就会输出ConardLi,结果却抛出了ReferenceError,那么这很好的说明了,let也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。

变量的赋值可以分为三个阶段:

·创建变量,在内存中开辟空间
·初始化变量,将变量初始化为undefined
·真正赋值

关于let、var和function:
·let 的「创建」过程被提升了,但是初始化没有提升。
·var 的「创建」和「初始化」都被提升了。
·function 的「创建」「初始化」和「赋值」都被提升了。

C 3条回复 评论
墨色槐

收益匪浅啊

发表于 2022-02-16 23:00:00
0 0
半糖去冰

对我帮助很大,最重要的是帮我认识到自己的不足

发表于 2022-02-02 21:00:00
0 0
半个八度

深入浅出

发表于 2022-01-04 22:00:00
0 0