js中严格模式的限制

文章类型:Javascript

发布者:hp

发布时间:2023-03-26

一原因:消除Javascript语法的一些不合理、不严谨之处,减少怪异行为,消除代码运行不安全,保证代码运行安全,提高编译器效率,增加运行速度,为未来新版本做铺垫。

在 JavaScript 脚本的开头添加"use strict";或'use strict';单文件严格模式、特定函数严格模式

二条件:

1:变量必须声明后再使用

v = 1; // 此处报错:Uncaught ReferenceError: v is not defined

2:函数的参数不能有同名属性,否则报错

function square(a, a) {     // 此处报错:Uncaught SyntaxError: Duplicate parameter name not allowed in this context
return a * a;
}

3:不能使用with语句

with(Math) {        // 此处报错:Uncaught SyntaxError: Strict mode code may not include a with statement
var area2 = PI * radius2 * radius2;
}

4:不能对只读属性赋值,否则报错

var person = {name: "Peter", age: 28};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // 此处报错:Uncaught TypeError: Cannot assign to read only property 'gender' of object '#<Object>'

5:不能使用前缀0表示八进制数,否则报错

var x = 010; // 此处报错:Uncaught SyntaxError: Octal literals are not allowed in strict mode.
console.log(parseInt(x));

6:不能删除不可删除的属性,否则报错

delete Object.prototype;

7:不能删除变量delete prop,会报错,只能删除属性delete global[prop]

var person = {name: "Peter", age: 28};
delete person; // 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

8:eval不会在它的外层作用域引入变量,eval 语句本身就是一个局部作用域,通过 eval 语句生成的变量只能在 eval 语句内使用

eval("var x = 5; console.log(x);");
console.log(x); // 此处报错:Uncaught ReferenceError: x is not defined

9:eval和arguments不能被重新赋值

function add(){
arguments = 3;
console.log(arguments);
}

10:arguments不会自动反映函数参数的变化:,不能使用arguments.callee,不能使用arguments.caller,函数的调用栈 (谁调用了这个函数,全局当中调用caller是null)


function add(){
b();
}
function b(){
console.log(arguments.callee.caller);
}

11:禁止this指向全局对象,会报undefined

function demoTest() {
console.log(this);
}

12:不能使用fn.caller和fn.arguments获取函数调用的堆栈

function add(){
b();
}
function b(){
console.log(b.caller);
}

13:增加了保留字(比如protected、static和interface)

implements
interface
let
package
private
protected
public
static
yield

14:不能在if语句中声明函数

//如果在if语句中声明函数,则会产生语法错误
if (true) {
function demo() { // 此处报错:Uncaught ReferenceError: demo is not defined
console.log("http://c.biancheng.net/");
}
}

15:不允许删除函数


function sum(a, b) {
return a + b;
}
delete sum; // 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
下一篇js中的es6