use strict
严格模式, 很推荐使用, 在开发中还是可以去使用严格模式的来进行代码编写避免不必要的性能损耗并且更加安全
我们可以在函数内使用严格模式也可以在js开头全局严格模式, 为什么要这样分呢, 这关系到多人参与同一项目, 个人代码编写习惯有人喜欢用严格模式, 那如果我们强行加了严格模式到全局有可能导致在代码合并
的时候出错, 因为对方不是用严格模式写的代码, 我们写了严格模式, 对方就会出错
所以对此很多时候我们是在函数内部使用严格模式, 或者大家统一就好
那么严格模式有诸多好处,有什么规范吗
最明显的就是, 所有变量前面都要用
var
定义禁制this
指向全局对象,严格模式下的this值就是undefined
禁用了with()
语句, 很正常, with本来性能就不好参数和属性不可以重名
禁制用八进制表示法
函数带有申明的就必须写在顶层
-
现在的arguments只能用来表示传入的参数, 是不可写的, 并且不可以使用
arguments.callee()
这也是很正常的, arguments.callee()用于匿名函数调用自身本身就会有很多问题, 比如递归调用的时候回获取到不同的this,
arguments.callee.caller
也被废弃了解决方法
用命名函数表达式就可以了 -
eval单独作用域
, 正常模式下不推荐使用eval, 就是因为其作用域很影响性能, 但是严格模式就很ok , eval的作用域是单独的, 和全局作用域还有局部作用域都无关eval("var a = 2;");// a 作用域只有在eval中才能访问
-
禁制在函数内部遍历调用栈
functio.caller和function.arguments会报错
严格模式下无法删除变量, 只有在configurable设置为true的对象属性才可以被删除
-
对一个对象的只读属性进行赋值会报错
Object.defineProperty(O, "num", { value: 12, writable: false });
其他的就和上面比较类似, 就是
说了不可以删除, 那就是不可删除 , 说了是只读属性就不可以写入, 什么保留字啊我们在开发过程中没必要去触碰风险