嚴(yán)格模式就是在代碼片段的頂部加上一個(gè)字符串常量的語句"use strict";(也可以用單引號),它可以是全局的,也可以是局部的(function和eval兩種局部作用域)。但是它必須是代碼的第一個(gè)語句(未必要是第一行)。在它之前如果有任何語句(包括空語句),嚴(yán)格模式的聲明就會失效。
"use strict";//全局嚴(yán)格模式
function func(){ "use strict"; //局部嚴(yán)格模式};eval('"use strict";/*局部嚴(yán)格模式*/');
;"use strict";//失效的嚴(yán)格模式聲明
知道了嚴(yán)格模式的聲明,那么它到底要怎么用呢?下面我們一個(gè)個(gè)功能說明。
1. 變量必須聲明才能使用"use strict";a=1; //缺少var語句做聲明,因此報(bào)錯
"use strict";var a=b=1; //錯誤 b未聲明
2. 函數(shù)聲明語句(不包括表達(dá)式)不允許在普通代碼塊(不包括閉包)中使用"use strict";(function(){ //閉包中是允許使用函數(shù)聲明語句的 function func(){};})();{ var f=function(){}; //函數(shù)聲明表達(dá)式允許 function func(){}; //函數(shù)聲明語句在普通閉包中,錯誤};
3. 閉包內(nèi)的this不指向Global對象"use strict";(function(){ alert(this); //輸出undefined})();
4. 對象屬性和函數(shù)形參不能重復(fù)聲明"use strict";var o={a:1,a:1};//這個(gè)對象定義了兩個(gè)a屬性,因此報(bào)錯
"use strict";function func(a,a){};//這個(gè)函數(shù)的兩個(gè)形參都是a,因此報(bào)錯
5. eval擁有類似閉包的作用域"use strict";var a=1,b=1;eval("var a=2");window.eval("var b=2");alert(a); //輸出1 因?yàn)檫\(yùn)行的a變成了eval作用域的局部變量alert(b); //輸出2 window.eval依然是全局作用域
6. callee和caller屬性無法使用"use strict";function func(){ return arguments.callee; //錯誤 callee無法使用};func();
7. with語句無法使用"use strict";with({});
8. 八進(jìn)制數(shù)字常量無法使用"use strict";var a=0999; //十進(jìn)制,可以使用var b=0123; //八禁止,無法使用
9. 普通模式下的一些無效操作變成錯誤"use strict";var a=1;delete a;//錯誤 無法刪除var聲明的變量
"use strict";var o={get a(){}};o.a=1;//錯誤 給只讀屬性賦值
暫時(shí)就總結(jié)出這些啦,還有一些細(xì)節(jié)的條款我也描述的不是那么準(zhǔn)確,建議看看MDN上的描述。參考:
MDN Strict_mode
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。