1 整個腳本文件開啓嚴格模式
全部語句以前放"use strict"
全部該腳本的子級做用域也會設置爲嚴格模式
注意: 嚴格模式和非嚴格模式腳本混合會存在問題javascript
//0.js "use strict" function strictTest0() { //函數內部也會設置爲嚴格模式 a = 1;//函數調用時報錯 } strictTest0();
//1.js "use strict"; !function strictTest0() { a = 1; }() //等同於 "use strict"; (function strictTest0() { a = 1; })() //1-1.js var a = 1; "use strict";//嚴格模式寫在第二行不起做用 (function strictTest0() { a = 1; })()
小技巧: 在函數聲明(function)前加"!"能夠讓解釋器理解爲函數表達式而非函數聲明,這樣在末尾加()能夠當即調用java
2 爲函數開啓嚴格模式函數
c = 1;//並不會報錯 function strictTest() { "use strict" a = 1;//函數調用時報錯 } strictTest();
3 多個<Script>標籤之間的嚴格模式
嚴格模式在多個Script標籤之間並不互相影響this
<script> "use strict" a = 1;//報錯 </script> <script> b = 1;//不報錯 </script>
4 花括號{}內使用嚴格模式
不要在封閉大括弧 {} 內這樣作,在這樣的上下文中這麼作是沒有效果的指針
//2.js "use strict"; with({ x: 1 }) {console.log(x);}//報錯,不容許使用with a = 1; //報錯,不容許給未聲明的變量賦值 var obj = { x: 1, x: 2 }; //IE10+報錯。IE7~九、Chrome、FF不報錯,結果爲:2 console.log(0123); //報錯,禁止八進制字面量 //保留的關鍵字,不能用這些名字做爲變量名或者形參名 //eval, arguments, implements, interface, let, package, private, protected, public, static 和 yield function test(a, a, b) { //聲明時即會報錯,不容許同名參數名 console.log(a + b); }(1, 2, 3); (function(a) { 'use strict'; arguments[0] = 100;//arguments和a並指向同一個值的引用,a做爲副本存在; 但若是傳的參數是對象,仍然指向用一個引用({x:1}) console.log(a); //1 console.log(arguments[0]); //100 delete a; //SyntaxError(語法錯誤) eval('var evalVal = 2;'); //eval嚴格模式下爲獨立做用域 console.log(typeof evalVal); //undefined function fun() { return this; } //嚴格模式的this指針指向undefined console.log( fun() ); //undefined })(1);
//非嚴格模式下執行如下函數 (function(a) { arguments[0] = 100;//arguments和a指向同一個值的引用 console.log(a); //100 console.log(arguments[0]); //100 delete a;//非嚴格模式返回false,靜默失敗。(靜默失敗:不報錯也沒有任何效果) eval('var evalVal = 2;'); //eval非獨立做用域 console.log(typeof evalVal); //number function fun() { return this; } //非嚴格模式的this指針指向Window console.log( fun() ); //Window })(1); (function (a, a, b) {//最後一個重名參數會覆蓋以前的重名參數 console.log(a + b); //5 })(1, 2, 3);