JavaScript严格模式详解:语法限制与行为变更
本文深入解析JavaScript中的严格模式(Strict Mode)。通过添加'use strict'指令,该模式消除了语言的不严谨之处,强制要求变量必须声明,禁止重复参数名,并改变了arguments对象与this的指向行为。了解这些限制有助于编写更安全、规范的代码,避免意外创建全局变量及语法错误。
严格模式概述与启用方式
严格模式(Strict Mode)是JavaScript语言的一种受限执行变体。
它旨在使代码编写更加规范,消除语言中不合理或不严谨的语法特性,从而减少潜在的怪异行为。
启用方式相对简单。
只需在脚本或函数顶部添加字符串字面量'use strict'即可。这种语法设计具有良好的向后兼容性:不支持严格模式的JavaScript引擎会将其视为未赋值的字符串并忽略;而支持该模式的引擎则会正式开启严格模式。
'use strict'
具体说明如下:
1. 若在全局作用域使用,则整个JavaScript脚本均启用严格模式。
2. 若仅在函数内部使用,则严格模式仅对该函数内部生效。
function doSomething(){
'use strict'
// 其他代码
}
变量与对象的严格限制
变量声明规则
在严格模式下,变量的创建时机与方式受到严格限制。首要规则是禁止意外创建全局变量。在非严格模式中,可以直接赋值给未声明的变量以隐式创建全局变量,但在严格模式下,这种做法会被禁止。
// 未声明变量 // 非严格模式: 创建全局变量 // 严格模式: 抛出ReferenceError错误
2. 严格模式对变量命名也有特定限制。禁止使用特定的保留字(如implements、interface、let、package、private等)作为变量名,否则将导致语法错误。
对象操作限制
在严格模式下,对对象的操作比非严格模式更容易触发错误。以下三种情况会直接导致语法错误或类型错误:
1. 尝试为只读属性赋值,将抛出TypeError。
2. 对不可配置的属性使用delete操作符,将抛出TypeError。
3. 尝试向不可扩展的对象添加新属性,将抛出TypeError。
函数参数与arguments对象的行为
函数参数与arguments对象
严格模式要求命名函数的参数名必须唯一。
// 重命名参数的
// 非严格模式:没有错误,只能访问第二个参数,如果要访问第一个参数,就必须通过arguments
// 严格模式语法错误
function sum(num,num){
//do something
}
此外,arguments对象的行为也发生了改变。在非严格模式下,修改命名参数的值会同步反映在arguments对象中;而在严格模式下,命名参数与arguments对象完全独立,互不影响。
function showValue(value){
value = 'foo'
console.log(value)
console.log(arguments[0]) // 非严格模式 : 'foo' 严格模式 :'hello'
}
showValu('hello')
函数参数唯一性
严格模式中,函数的参数必须保持唯一,不允许重名。
// 重名的参数
// 非严格模式中,没有错误,只能访问第一个参数
// 严格模式 :抛出错误 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
function sum(num,num){
'use strict'
// do something
}
arguments对象独立性
在非严格模式中,修改命名参数的值会反应到arguments对象中;而在严格模式下,这两个值是完全独立的。
// 修改命名参数的值
// 非严格模式:修改会反应到arguments中
// 严格模式中不会反应到arguments中
function sum(num,num2){
'use strict'
num=3
console.log(arguments[0],num2)// 严格模式下输出为1,2 非严格模式下输出为3,2
}
sum(1,2)
eval()与this指向的特殊处理
eval()函数的行为变更
eval函数在严格模式下最大的变化在于其不再在包含上下文中创建变量或函数。
// 使用eval函数创建变量
// 非严格模式中:弹出框弹窗 20
// 严格模式中:调用alert(x)时报错
function doSomething(){
eval('var x=20')
alert(x)
}
在严格模式中,可以在eval()中声明变量和函数,但这些变量或函数仅在被求值的特殊作用域内有效,执行完毕后即被销毁。
'use strict'
var result=eval('x=1,y=13;x+y')
alert(result)
例如,在eval中声明变量x和y并计算它们的和赋值给result。此时alert(result)可以正常输出结果(如21),但调用alert(x)或alert(y)时会报错,因为x和y在eval外部已不存在。
this指向的抑制
在非严格模式下,使用函数的apply()或call()方法时,null和undefined值会被自动转换为全局对象。而在严格模式下,函数的this值始终是指定的值,无论该值是什么(包括null或undefined)。
// 访问属性
// 非严格模式:访问全局实行
// 严格模式:抛出错误,因为this的值是null
var color = "red";
function displayColor() {
alert(this.color);
}
displayColor(null);
with语句的废弃
其他语法变更
在严格模式中,with语句已被废弃。非严格模式下,with语句可以改变标识符的解析路径;但在严格模式下,使用with语句将直接导致语法错误。
// with语句
// 非严格模式:允许
// 严格模式:抛出语法错误
with (location) {
console.log(href);
}
总结
以上内容介绍了JavaScript严格模式的核心特性。希望这些信息能帮助大家更好地理解和使用严格模式。如有任何疑问,欢迎留言交流。感谢支持!
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
