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 = 10;   //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>

  

 

原文地址:https://www.cnblogs.com/liuqingxia/p/9963105.html