JavaScript 嚴格模式

嚴格模式 - "use strict"

1. 嚴格模式做用域

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. 嚴格模式做用

//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);
相關文章
相關標籤/搜索