Javascript严格模式与一般模式的区别

严格模式是指使代码在严格条件下运行。如果你在JavaScript脚本的头部看到“use strict”,那么就表明当前处于严格模式下。严格模式主要是为了消除JavaScript语法的一些不合理和怪异之处。

严格模式主要有以下限制:

  1. 变量必须先声明后使用,且无法删除,不能重复
"use strict"
a = 1; //报错 Uncaught ReferenceError: a is not defined

var b = 1;
delete b;//报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

function foo(p1, p1){} //报错 Uncaught SyntaxError: Duplicate parameter name not allowed in this context

2.不能使用with语句
with语句用于暂时修改作用域链,语法如下:

with (Object)
    statement

废弃with的主要原因是因为它在引用对象时不可预测,使得代码难以优化,并且还会拖慢代码的执行速度。

3.不能对只读属性赋值,不能删除不可删除的属性

var obj = {};
obj.defineProperty(obj, 'a', {value:1, writable: false});//writable=false使属性不可写
obj.a = 2; //报错 Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>'

delete Object.prototype //报错 Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }

4.不能使用八进制数和转义字符

var a = 010; //报错 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
var a = \010; //报错 Uncaught SyntaxError: Invalid or unexpected token

5.eval不能被重新赋值,在作用域 eval() 创建的变量不能被调用

var eval = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
eval('var a = 1')
console.log(a) //报错 Uncaught ReferenceError: a is not defined

6.arguments不能被重新赋值,不会自动反映函数参数的变化

var arguments = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode

7.禁止this指向全局对象
在严格模式下,顶层this指向undefined,而不再指向全局对象。

function foo1(){
    return this; //返回Window对象
} 
function foo2(){ 
    "use strict";
    return this; //返回undefined
}

8.不能使用arguments.calleearguments.caller
arguments.callee通常用在函数的递归调用中,废弃的原因主要是因为它在每次递归调用时都需要重新创建,不仅影响性能,还会影响闭包。详细说明可以查看MDN文档
arguments.caller属性用在函数执行的时候调用自身。废弃的原因是因为其潜在的不安全性。

9.不能使用fn.callerfn.arguments获取函数调用的堆栈
fn.caller返回的是函数的调用者,当一个函数fn在全局作用域内被调用时,fn.callernull,当一个函数fn在另外一个函数作用域内被调用的,fn.caller则指向调用它的那个函数。
fn.arguments代表传入函数的实参,已被废弃,可以使用函数内部的arguments对象代替。
详细可参见MDN文档

10.增加了保留字,包括publicprivateprotectedstaticletyieldpackageinterfaceimplements

"use strict" 指令只允许出现在脚本或函数的开头,并且在ES6的模块中自动采用严格模式。
不管是否使用严格模式,都应该按照严格模式的标准来书写代码,这样可使得代码更加安全、稳定。

posted @ 2019-11-20 10:03  YornQiu  阅读(456)  评论(0编辑  收藏  举报