面试题答案
一键面试严格模式与非严格模式下变量提升规则对比
- 函数声明
- 非严格模式:
- 提升表现:函数声明会被提升到其所在作用域的顶部。可以在函数声明之前调用函数。
- 示例:
- 非严格模式:
// 非严格模式
sayHello();
function sayHello() {
console.log('Hello');
}
- **原因**:JavaScript引擎在编译阶段会将函数声明提升,使得整个函数作用域内都能访问到该函数,这样设计是为了方便开发者组织代码结构,让函数调用不受声明顺序的限制。
- 严格模式:
- 提升表现:与非严格模式类似,函数声明也会被提升到其所在作用域的顶部。同样可以在函数声明之前调用函数。
- 示例:
// 严格模式
'use strict';
sayHello();
function sayHello() {
console.log('Hello');
}
- **原因**:保持与非严格模式下函数声明提升行为的一致性,方便开发者理解和迁移代码,同时严格模式主要是对一些可能导致错误或不安全的操作进行限制,而函数声明提升不属于此类情况。
2. 变量声明
- 非严格模式:
- 提升表现:变量声明会被提升到其所在作用域的顶部,但变量的赋值不会提升。也就是说,在变量声明之前访问变量,会得到
undefined
。 - 示例:
- 提升表现:变量声明会被提升到其所在作用域的顶部,但变量的赋值不会提升。也就是说,在变量声明之前访问变量,会得到
// 非严格模式
console.log(a);
var a = 10;
在上述代码中,console.log(a)
会输出undefined
,因为变量a
的声明被提升到了作用域顶部,但赋值a = 10
仍在原来的位置。
- 原因:JavaScript的这种设计是为了让变量在整个作用域内都有定义,即使在声明之前使用也不会报错(只是值为undefined
),这样可以避免在复杂的代码结构中因为变量声明位置不当导致的问题。
- 严格模式:
- 提升表现:变量声明同样会被提升到其所在作用域的顶部,但与非严格模式不同的是,在变量声明之前访问变量会抛出
ReferenceError
。 - 示例:
- 提升表现:变量声明同样会被提升到其所在作用域的顶部,但与非严格模式不同的是,在变量声明之前访问变量会抛出
// 严格模式
'use strict';
console.log(a);
var a = 10;
在严格模式下,上述代码会抛出ReferenceError: a is not defined
,因为严格模式更严格地检查变量的使用,不允许在变量声明之前使用变量。
- 原因:严格模式旨在减少JavaScript中一些容易出错的行为,这种对变量使用的严格检查有助于开发者更早地发现代码中的错误,写出更健壮的代码。