当前位置: 首页>前端>正文

如何理解 JavaScript 严格模式 js严格模式的区别

严格模式是指使代码在严格条件下运行。如果你在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
  1. 不能使用with语句
    with语句用于暂时修改作用域链,语法如下:
with (Object)
    statement

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

  1. 不能对只读属性赋值,不能删除不可删除的属性
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] }
  1. 不能使用八进制数和转义字符
var a = 010; //报错 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
var a = 0; //报错 Uncaught SyntaxError: Invalid or unexpected token
  1. 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
  1. arguments不能被重新赋值,不会自动反映函数参数的变化
var arguments = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
  1. 禁止this指向全局对象
    在严格模式下,顶层this指向undefined,而不再指向全局对象。
function foo1(){
    return this; //返回Window对象
} 
function foo2(){ 
    "use strict";
    return this; //返回undefined
}
  1. 不能使用arguments.calleearguments.callerarguments.callee通常用在函数的递归调用中,废弃的原因主要是因为它在每次递归调用时都需要重新创建,不仅影响性能,还会影响闭包。详细说明可以查看MDN文档。
    arguments.caller属性用在函数执行的时候调用自身。废弃的原因是因为其潜在的不安全性。
  2. 不能使用fn.callerfn.arguments获取函数调用的堆栈
    fn.caller返回的是函数的调用者,当一个函数fn在全局作用域内被调用时,fn.callernull,当一个函数fn在另外一个函数作用域内被调用的,fn.caller则指向调用它的那个函数。
    fn.arguments代表传入函数的实参,已被废弃,可以使用函数内部的arguments对象代替。
    详细可参见MDN文档。
  3. 增加了保留字,包括publicprivateprotectedstaticletyieldpackageinterfaceimplements

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



https://www.xamrdz.com/web/2fk1963444.html

相关文章: