严格模式对JavaScript的语法做了一些改变,引入了一些限制和更严格的规则。
具体实例:
下面是一些严格模式相对于普通模式的语法改变:
1.变量必须先声明后使用:
在严格模式中,变量必须通过var、let或const关键字进行声明,否则会抛出ReferenceError。而在普通模式中,如果没有用关键字声明变量,JavaScript会将其默认为一个全局变量。
"use strict"; v = 1; // 在严格模式下,使用未声明的变量会导致错误:ReferenceError: v is not defined console.log(v); // 这行代码不会执行到,因为之前的赋值语句已经抛出了错误 // 在普通模式下,上述代码会正常执行,并将变量 v 视为全局变量
2.禁止删除变量:
在严格模式中,使用delete操作符删除变量会报错。而在普通模式中,delete操作符可以用于删除对象的属性或数组的元素。
"use strict"; var x = 10; console.log(x); // 输出:10 delete x; // 在严格模式下,会导致错误:SyntaxError: Delete of an unqualified identifier in strict mode. console.log(x); // 删除操作不会成功,输出:10
3. 函数中不允许有同名的参数
在严格模式下,如果函数中有两个或多个同名参数,则会抛出语法错误,而在普通模式下则不会
function square(a, a) { return a * a; } console.log(square(2, 3)); // 在严格模式下,会报错:SyntaxError: Duplicate parameter name not allowed in this context
4. eval 语句的作用域是独立的
在严格模式下,eval 语句本身就是一个局部作用域,并且通过 eval 语句生成的变量只能在 eval 语句内部使用:
"use strict"; var x = 10; function test() { var x = 5; eval("var y = 20;"); console.log(y); // 在严格模式下,会导致错误:ReferenceError: y is not defined } test();
在上述例子中,eval 语句创建了一个变量 y,但在严格模式下,它只能在 eval 语句内部使用。在尝试在 eval 外部访问变量 y 时,会导致 ReferenceError 错误。
本文固定URL:https://www.dotcpp.com/course/1300