javascript的严格模式

开启程序的严格模式:"use strict".
一:语法限制.有7种语法在严格模式中被禁用了.

 1.对象直接量的相同属性名.

1 "use strict";       
2         var obj = {
3         "name":"guoyans",
4         "name":"kldd"
5         }

2.在函数中,形参数中带有相同的参数名.

 function app(x, x, z) { return x + z; }
        var app = new Function("x", "x", "z", "return x+z");

在非严格模式下,访问多个同名的形参时,只有最后一个声明是有效的.

 //下面的函数在非严格模式下是有效的.
        function foo(m, m, n, m, a, n) { return m + n; }
        //显示10,m和n分别为4,和6
        alert(foo(1,2,3,4,5,6));

3.不能声明或重写eval和arguments这两个标识符,
也就是说,他们不能出现在赋值运算的左边,也不能用var语句来声明.
顺便说一下,arguments和eval都不能用delete删除

 1 //禁止:向eval或arguments赋值
 2         eval = function () { }
 3         //禁止:重新声明eval或arguments
 4         var arguments;
 5         //禁止:将eval或arguments用做catch子句的异常对象名
 6         try {
 7 
 8         } catch (eval) {
 9 
10         }
11         //禁止:将eval或arguments用做函数名
12         function arguments() { }
13         //禁止:删除arguments,或形参名
14         function foo() {
15             delete arguments;
16         }

4.使用0前缀声明的8进制的常量.

var num = 012;

 5.用delete删除显示声明的标识符,名称或具名函数.

//删除变量名
        var x;
        delete X;
        //删除具名函数
        function foo() { }
        delete foo;
        //删除arguments,或形参名
        function foo(x) {
            delete x;
        }
        //删除catch子句中声明的异常对象
        try {

        } catch (e) {
        delete e;}

6.代码中使用一些扩展的保留字.
implements,interface,let,package,private,prototected,public,
static,以及yield.

1  //使用扩展保留字
2     var yield;
3     function let() { }

7.使用width语句.

1  with (document) {
2         write("哈哈哈");
3     }

1.因为第一个<script>中,第一行的代码
已经表明当前引擎运行在严格模式中,因此foo();
函数在语法解释期就会发生异常,程序解释到此停止.
第二个<script>也不会解释了.
2.如果在某个函数的内部加入"use strict".
那么他就不会影响到外面的代码了

1 function foo() {
2             "use strict";
3             //...
4         }
5         var eval;

这段代码中,foo()函数运行在严格模式下,
而外面的代码却运行在非严格模式下,所以var eval是合法的.
上面的代码可能会让人产生误解,
use strict后面的代码会受到严格模式的限制,
那么前面的代码是不是就不会受到严格模式的限制呢.
比如说foo这个位置的函数名还有后面的形参就不会受到限制呢.

 function eval(x,x,a) {
            "use strict";
            //...
        }
        var eval;

这段代码在语法解释时,抛出错误.因为use strict控制的是整个代码块,
函数名和形参还有函数体构成一个代码块,所以函数名和参数的设置在严格模式下都是会报错.

如果"use strict"出现在代码中间,那么他将会被忽略,
代码也不会进入严格模式.

1 //这列是空行
2         "use strict";
3         var eval;
4         function foo(m, n) {
5             ;
6             "use strict";
7             return m;
8         }

这段代码就就不会进入严格模式,
因为"use strict"在所在的代码块中,不是位于第一行.

原文地址:https://www.cnblogs.com/guoyansi19900907/p/3654751.html