严格模式详解
1.严格模式的好处
1.1消除javascript不合理、不严谨之处,减少怪异行为
1.2消除代码的不安全之处,保证代码的安全运行
1.3提高编译器的效率,增加运行速度
1.4为后续版本的javascript做铺垫
2.严格模式的进入标准
2.1"use strict"(老版本不支持将会忽略,变为不同模式)
3.如何调用
3.1整个脚本的调用
放在脚本的第一行将是整个脚本都是严格模式,不在第一行则无效,所以如果多个严格模式的文件合并时要注意
1 <script> 2 "use strict";//放在脚本的第一行将是整个脚本都是,不在第一行则无效 3 console.log("这是严格模式"); 4 </script>
3.2单个函数的调用
1 <script> 2 (function(){ 3 "use strict" 4 console.log("这是单个函数的调用"); 5 })() 6 </script>
4.语法和行为的改变
4.1禁止使用没有声明的变量(在普通模式中没有声明就赋值的变量默认是全局变量);
1 <script> 2 v = 3;//报错,v没有声明 3 for(i=0;i<5;i++){}//报错,i没有声明 4 </script>
4.2静态绑定
javascript是允许"动态绑定",即某些属性和方法到底是属于那个对象,不是在编译时确定的而是在运行的时候确定的,而严格模式是不允许"动态绑定"的,也就是说在编译的时候就确定了属性和方法是属于哪个对象,
好处(这样有利于提高编译效率,代码也更容易阅读,更少出意外);
4.2.1禁止使用with
1 var col = { 2 v:4, 3 l:5 4 } 5 with(col){//with为语句指定特定的对象,严格模式下不能使用with,because无法在编译时确定属性到底属于哪个对象 6 console.log(v);//普通模式下值为4 7 }
4.2.2创建eval作用域
1 var v = 1; 2 console.log(eval("var v = 5; v;"));//在严格模式下eval本身就是一个作用域,不能再生成全局变量了 3 console.log(v); 4 //严格模式下输出5;1 5 //普通模式下输出5;5
5.增强安全措施
5.1禁止this指向全局变量
1 (function foo(){ 2 "use strict" 3 console.log("show this:"+(this));//严格模式下禁止this指向全局变量,使用this会是undefined; 4 })(); 5 6 7 function aa(){ 8 "use strict" 9 this.a = 1; 10 } 11 aa(); //直接调用aa()会报错,应为此时的this是undefined 12 var bb = new aa();//this对象引用bb对象,还继承了该函数的原型 13 console.log(bb.a);//返回的是1;
6.禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
1 "use strict"; 2 3 var x; 4 5 delete x; // 语法错误 6 7 var o = Object.create(null, 'x', { 8 value: 1, 9 configurable: true 10 });
7.重名错误
7.1对象不能有重名属性
1 (function(){ 2 "use strict" 3 var obj = { 4 p:1, 5 p:2 6 } 7 console.log(obj.p);//在高版本的浏览器中是可以显示2的,在低版本中会报错 8 })();
7.2函数不能有重名参数
1 function f(a,a,b){ 2 "use strict" 3 a = 2; 4 return [a,arguments[0]]; 5 }//Duplicate parameter name not allowed in this context
8.函数必须声明在顶层(然而我运行后是没有报错的,是现在的浏览器都支持了么)
将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
1 "use strict"; 2 3 if (true) { 4 5 function f() { } // 语法错误 6 7 } 8 9 for (var i = 0; i < 5; i++) { 10 11 function f2() { } // 语法错误 12 13 }
9.保留字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
使用这些词作为变量名将会报错。
1 function package(protected) { // 语法错误 2 3 "use strict"; 4 5 var implements; // 语法错误 6 7 }
这是宝宝看到别人的文章后自己实践了一下发现有些问题,就自己半应用半用自己的实践结果的总结,还有一些其他的自己没有用到就没有写
http://www.cnblogs.com/ranzige/p/3564113.html参考地址