1.下面代码的输出是什么
function sayHi() {
console.log(name)
console.log(age)
var name = "zhangsan"
let age = 24
}
sayHi()
A:zhangsan 和 undefined
B:zhangsan 和 ReferenceError
C:ReferenceError 和 24
D:undefined 和 ReferenceError ✔
运行结果:
* 在函数中,我们首先使用var关键字声明了name变量
变量在创建阶段会被提升(javascript 会在创建变量阶段为其分配内存空间)
默认值为 undefined,
实际执行到使用该变量的时候,还没为name变量赋值,仍为undefined
* let 关键字(和const)声明的变量也会存在变量提升
但与 var 不同,初始化没有被提升,
声明(初始化)他们之前,他们是不可访问的,“暂时死区”
在变量声明变量之前尝试访问变量时,会抛出一个ReferenceError
变量的赋值分为三个阶段
* 创建变量,在内存中开辟空间
* 初始化变量,将变量初始化为 undefined
* 真正赋值
关于let ,var 和 function
* let 的创建过程被提升了,但是初始化没有提升
* var 的创建和初始话都被提升了
* function 的创建 初始化 和 赋值 都被提升
let 存在变量提升的示例
let name = "zhangsan"
{
console.log(name)
let name = 'lisi'
}
* 如果不存在变量提升,就会打印 zhangsan
* 抛出 ReferenceError 说明变量提升了,现在是 ‘暂时死区’,
还没初始化或者赋值 不能访问