date : *2017.09.01 在我们看别人源码的时候,经常能看到下这两种代码:
function method() { 'use strict'; // do something } 'use strict'; function method() { // do something }那么这个字符串 ‘use strict’ 是做什么用的呢?
所谓严格模式,顾名思义就是让Javascript在更严格的条件下运行,目的如下;
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;消除代码运行的一些不安全之处,保证代码运行的安全;提高编译器效率,增加运行速度;为未来新版本的Javascript做好铺垫;像上面的示例代码,进入严格模式只需要在函数内部加上 use strict 即可以让该函数进入严格模式,当然,如果你希望整个脚本都在严格模式下运行,你可以在脚本第一行全局加上 use strict (注意,这里必须得是脚本文件的第一行) 这个就能让你的整个脚本进入严格模式。
严格模式在高版本的浏览器中遇到 use strict 会直接进入严格环境,但是遇到老版本的浏览器,它会把 use strict 当成一行普通的字符串,加以忽略,从而进入JS的普通模式,所以不存在浏览器的兼容问题。
有些人喜欢偷懒,比如:
x = 1; console.log(x) //1普通模式下有些人喜欢直接给变量名赋值,到了变量都懒得申明的那种(虽然我平时也喜欢这样#滑稽脸),这虽然能够声明一个全局变量,但是到了严格模式,啧啧…
'use strict' x = 1; //Uncaught ReferenceError所以,在严格的模式下,变量必须要声明,let const var 不管你用哪个,总之规则就是这样。
禁止使用with在正常的模式下,如果尝试去delete一个参数的话,一般来说是没有什么意义,会返回一个false,并且删除不成功;
!function(a){ console.log(delete a); }(1) // false但是在严格模式下,如果你这样写,它会直接报一个Uncaught SyntaxError
!function(a){ 'use strict'; delete a; }(1) //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. delete不可配置的属性报错这个较为好理解,直接上代码
//普通模式 !function(){ console.log(0123) }() // 83 //严格模式 !function(){ 'use strict'; console.log(0123); }() // Uncaught SyntaxError: Octal literals are not allowed in strict mode. eval独立作用域 //普通模式 !function(){ eval('var evalVal = 2;') console.log(typeof evalVal); }(); // number //严格模式 !function(){ 'use strict'; eval('var evalVal = 2;') console.log(typeof evalVal); }(); // undefined