1foo(typeof a); 2function foo(p) { 3 console.log(this); 4 console.log(p); 5 console.log(typeof b); 6 let b = 0; 7}
参考答案:
最终答案:输出全局对象、'undefined',然后抛出 ReferenceError 错误。
这段代码涉及了几个关键点:变量提升(Hoisting)、typeof
运算符的特性、函数作用域内的 let
声明的“暂时性死区”,以及函数调用中的 this
指向。
1foo(typeof a); 2 3function foo(p) { 4 console.log(this); 5 console.log(p); 6 console.log(typeof b); 7 let b = 0; 8}
foo
被函数声明提升,因此在调用 foo(...)
时已可用;a
并未声明;b
,其声明在函数作用域内,且使用了 let
,存在暂时性死区(TDZ)。foo(typeof a)
typeof a
:虽然变量 a
未定义,但 typeof
操作符在访问未声明变量时不会抛错,而是返回 'undefined'
;
typeof a
的值是 'undefined'
;foo
被调用,参数 p
传入 'undefined'
。
foo
开始执行1function foo(p) { 2 console.log(this); // (1) 3 console.log(p); // (2) 4 console.log(typeof b);// (3) 5 let b = 0; 6}
(1) console.log(this);
在非严格模式下,this
指向 全局对象(浏览器中为 window
,Node 中为 global
);
若开启严格模式,则为 undefined
;由于题目未开启严格模式,这里输出全局对象。
(2) console.log(p);
输出参数值,即 'undefined'
(3) console.log(typeof b);
关键点:变量 b
在此处已被创建,但尚未初始化(let 声明的特性),处于 TDZ(暂时性死区)。
访问它会触发 ReferenceError
异常。
1<global object> // console.log(this) 2"undefined" // console.log(p) 3ReferenceError: Cannot access 'b' before initialization
最近更新时间:2025-08-04
题库维护不易,您的支持就是我们最大的动力!