js的严格模型

282 阅读3分钟

1、含义

ECMAScript5引入严格模式("strict mode")。通过严格模式,在函数内部选择进行较为严格的全局或局部的错误条件检测,使用严格模式的好处是可以提早知道代码中的存在的错。

进入严格模式的指令"use strict;"

这个语法从ECMAScript 3 开始支持。向后兼容不支持严格模式的浏览器,他们就当遇到了一个普通字符串,编译时忽略。

2、脚本文件或函数中使用

"use strict";放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。

<script>
    "use strict";
    //进入严格模式
</script>
<script>
    //正常模式
</script>

函数中的严格模式,指令放在函数内第一行

function foo(){
    "use strict";
    //严格模式
}
function boo(){
    //正常模式
}

特别注意: 建议只在特定的作用域中使用严格模式。放在全局作用域中(函数外部),页面的其他脚本也都处于严格模式下,不利于文件合并。

一种变通的方法

(function (){
    "use strict";
&emsp;&emsp;// some code here

})();

3、变量

(1)严格模式下,变量必须先声明再使用,不允许意外创建的全局变量

"use strict";
a = 'aa';  //报错,a未声明
for(i = 0; i < 10; i++){//报错,i未定义
}

(2)不能调用delete操作符删除一个变量名(而不是属性名)

"use strict";
var a = 'aa';
delete a;//报错

在非严格模式中,这样的代码只会静默失败,这样可能会导致用户误以为删除操作成功了

var a = 'aa';
delete a;
console.log(a);//'aa'

(3)不允许变量名或参数名使用这些词implements, interface, let, package, private, protected, public, static, yield

不允许使用eval或arguments作为变量名或函数名

function package(protected){ // 报错!  
  "use strict";  
  var implements; // 报错!  
  
  interface: // 报错!  
  while (true){  
    break interface; // 报错!  
  }  
  
  function private() { } // 报错!  
}  
function fun(static) { 'use strict'; } // 报错! 

4、对象

(1)不允许为只读属性赋值

(2)不允许对象字面量中使用两个相同的属性名

"use strict"  
var person = {  //报错
  name : "Tom"  
  name : "Cat"  
} 

非严格模式,person.name会取最后一个值

(3)为不可配置的属性使用delete操作符

(4)为不可扩展的对象添加属性

5、函数

(1)不允许函数形参中使用两个相同的参数名

"use strict"  
 function sum(num, num) {}  //报错

非严格模式,函数内部实际访问的是第二个参数,要访问第一个参数必须通过arguments对象

"use strict"  
function showValue(value) {  
    value = "Foo"  
    alert(value)        // Foo  
    alert(arguments[0]) // 严格模式 hi  
                        // 非严格模式 Foo  
}  
  
showValue("hi")  

(2) 不允许使用arguments.callee, arguments.caller, anyFunction.caller以及anyFunction.arguments

(3)只能在脚本的顶级和在函数内部申明函数,不允许在语句块中使用函数声明会,如for、if

"use strict";  
if (true){  
  function f() { } // 报错! syntax error  
  f();  
}  
  
for (var i = 0; i < 5; i++){  
  function f2() { } // 报错! syntax error  
  f2();  
}  
  
function baz(){ //ok 
  function eit() { } //ok
}

6、this

严格模式下抑制this

(function(){ return this; })()
 
Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
(function(){ 'use strict'; return this; })()
undefined

7、其他

(1)数字前面不允许0

"use strict";  
var sum = 015 + // 报错! syntax error  
          197 +  
          142; 
          
var n = 023;//报错!Octal literals are not allowed in strict mode
var s = "\047";//报错!Octal literals are not allowed in strict mode

(2)去掉with语句

参考链接

www.ruanyifeng.com/blog/2013/0…

developer.mozilla.org/zh-CN/docs/…