2018年11月14日晚上,我在“深入理解javascript”書上第一次知道“嚴格模式”“非嚴格模式”這2個名詞;
“嚴格模式”使用指令:“use strict”;
這個指令我其實有經常看到,在其他人的js文件里。當然我是不知道含義的,且我也沒有想過要去詢問,寫在那就在那吧,又不影響我。
今天做這個筆記的原因在於:既然在我學習中遇到了,那我就仔細的學習一下也還是不錯的!!!!
為什么使用嚴格模式?
1.消除js語法的一些不合理、不嚴謹之處,減少一些怪異行為;
1).消除代碼運行的一下不安全之處,保證代碼運行的安全;
2).提高編譯器效率,增加運行速度;
3).為未來新版本的js做好鋪墊。
2.“嚴格模式”提現了js更合理、更安全、更嚴謹的發展方向,包括IE10在內的主流瀏覽器,都已經支持它,許多大項目已經開始全面擁抱它。
3.另一方面,同樣的代碼,在“嚴禁模式”中,可能會有不一樣的運行結果;一些在“正常模式”下可以運行的語句,在“嚴禁模式”下將不能運行。掌握這些內容,有助於更細致深入地理解js,讓你成為更好的程序員。
0.嚴格模式其指令出現的位置:
0-1:直接寫在<script></script>中的第一行;(表示該篇js都處於嚴格模式下)
0-2:寫在方法中的第一行;(表示該方法下的代碼格式都處於嚴格模式)
<script> "use strict" // 以下的所有代碼都處於嚴格模式 <script> <script> function foo(){ "use strict" //該方法下的代碼處於嚴格模式 } </script>
1.嚴格模式下,不能使用未聲明的變量
<script> "use strict" x=123; //報錯( Uncaught ReferenceError: x is not defined) </script>
//非嚴格模式
<script> x=123; console.log(x) //輸出:123 </script>
//嚴格模式及非嚴格模式
<script> x=123; console.log(x) //輸出:123 foo(); //Uncaught ReferenceError: y is not defined function foo(){ "use strict" y=234; //報錯,y未定義 } </script>
2.嚴格模式下,不允許刪除 變量或對象 (強調:只有configurable設置為true的對象屬性,才能被刪除。)
<script> "use strict"; var x = 123; delete x; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. </script> <script> "use strict"; var x; 第一種: delete x; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. 第二種: var o = Object.create(null,{ 'x':{ value:1234, configurable:true } }); console.log(o.x) //輸出:1234 delete o.x; //刪除成功 console.log(o.x) //輸出:undefined </script>
3.嚴格模式下,不允許刪除函數
<script> "use strict"; function foo(p1,p2){} delete foo; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. </script>
4.嚴格模式下,不允許參數名相同
<script> "use strict"; function foo(p1,p1){} delete foo; //Uncaught SyntaxError: Duplicate parameter name not allowed in this context </script>
5.嚴格模式下,不允許使用八進制
<script> "use strict"; var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode. </script>
6.嚴格模式下,不允許使用轉義字符
<script> "use strict"; var x = \010; //Uncaught SyntaxError: Invalid or unexpected token(無效或意外的令牌) </script>
7.嚴格模式下,不允許對只讀屬性賦值
<script> "use strict"; var obj = {}; Object.defineProperty(obj, "x", { value: 0, writable: false });
obj.x = 3.14; //Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>' </script>
8.嚴格模式下,不允許對一個使用getter方法讀取的屬性進行賦值
<script> "use strict"; var obj = { get x() { return 0 } }; obj.x = 3.14; //Uncaught TypeError: Cannot set property x of #<Object> which has only a getter </script>
9.嚴格模式下,不允許刪除一個不允許刪除的屬性
<script> "use strict"; delete Object.prototype; //Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }(不能刪除函數對象()的屬性“原型”{ [本機代碼] }) </script>
10.嚴格模式下,變量名不能使用 "eval" 字符串
//嚴格模式下 <script> "use strict"; var eval = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(嚴格模式下的意外EVE或參數) console.log(eval) </script> //非嚴格模式下 <script> var eval = 3.14; console.log(eval) //3.14 </script>
11.嚴格模式下,變量名不能使用 "arguments" 字符串
//嚴格模式下 <script> "use strict"; var arguments = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(嚴格模式下的意外EVE或參數) console.log(arguments) </script> //非嚴格模式下 <script> vararguments = 3.14; console.log(arguments) //3.14 </script>
12.嚴格模式下,不允許使用以下這種語句
<script> "use strict" with(Math) { x = cos(2) }; //Uncaught SyntaxError: Strict mode code may not include a with statement </script>
13.嚴格模式下,由於一些安全原因,在作用域 eval() 創建的變量不能被調用
<script> "use strict" eval ("var x = 2"); alert (x); //Uncaught ReferenceError: x is not defined </script>