JS-嚴格模式、非嚴格模式


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>

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM