严格模式(Strict mode):
浏览器:在Strict mode跟没有Strict mode下的浏览器会有不同的执行结果。
如何进入Strict mode:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> 'use strict'
函式(function)中第一行登打use strict进入Strict mode,但是Strict mode的效果只侷限在该函式。 function foo1() { console.log(this); } foo1(); //指向window物件 function foo() { 'use strict'; //进入Strict mode console.log(this); } foo(); //undefined
特徵:某些条件下会报错
* 直接定义未宣告变数
<script> 'use strict' myName = 'Emma'; //Uncaught ReferenceError
* 不允许对变数及函式使用delete,会出现Uncaught SyntaxError。
<script> 'use strict' var myName = 'Emma'; delete myName; //Uncaught SyntaxError
<script> 'use strict' function sum(a, b) { return a + b; } delete sum; //Uncaught SyntaxError
* 不能接受重複的参数名称
<script> 'use strict' function square(a, a) { // Uncaught SyntaxError return a * a; } console.log(square(2, 2));
* silently fail失效:在非Strict mode下,有些错误不会被执行但是也不会报错中断,但是在Strict mode下会报错中断。
给不可写入的属性赋值:Object.defineProperty:会对一个物件定义、或是修改现有的属性。执行后会回传定义完的物件。
<script> 'use strict' var obj1 = {}; Object.defineProperty(obj1, "x", { value: 42, writable: false }); obj1.x = 9 //Uncaught TypeError
给只提供读取的属性赋值: <script> 'use strict'; var obj2 = { get x() { return 17; } }; obj2.x = 5; //Uncaught TypeError
给不能扩展的属性赋值:Object.preventExtensions:避免物件被新增新的属性。
<script> 'use strict'; var fixed = {}; Object.preventExtensions(fixed); fixed.newProp = "ohai" //Uncaught TypeError
* 不能接受Octal Numbers(八进位)
<script> 'use strict'; var x = 010; // Uncaught SyntaxError console.log(parseInt(x));
eval失效
在Strict mode下,eval无法再变更原变数。 <script> var name = 'Tom'; var name2 = eval("var name = 'Mary';"); console.log(name); //Mary <script> 'use strict' var name = 'Tom'; var name2 = eval("var name = 'Mary';"); console.log(name); //Tom
在Strict mode下,eval无法被当成变数名称、function names, 或是 function parameter names。<script> 'use strict'; var eval = 10; console.log(eval); //Uncaught SyntaxError
在Strict mode的this:一般函式呼叫(Simple Call)的 this 值都是 undefined。
参考文章:
JavaScript Strict Mode:https://www.tutorialrepublic.com/javascript-tutorial/javascript-strict-mode.phpMDN:Strict mode:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode