开启程序的严格模式:"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"在所在的代码块中,不是位于第一行.