为了转生而点技能-JavaScript,day15(Strict mode摘要整理

严格模式(Strict mode):

浏览器:在Strict mode跟没有Strict mode下的浏览器会有不同的执行结果。
如何进入Strict mode:

  1. 在scripts中必须在第一行打use strict才会整篇都生效。
<!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'
  1. 函式(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下会报错中断。

  1. 不可写入的属性赋值:
    Object.defineProperty:会对一个物件定义、或是修改现有的属性。执行後会回传定义完的物件。
    <script>
        'use strict'
        var obj1 = {};
        Object.defineProperty(obj1, "x", { value: 42, writable: false });
        obj1.x = 9            //Uncaught TypeError
  1. 只提供读取的属性赋值:
    <script>
        'use strict';
        var obj2 = { get x() { return 17; } };
        obj2.x = 5;        //Uncaught TypeError
  1. 不能扩展的属性赋值:
    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。

参考文章:

  1. JavaScript Strict Mode:https://www.tutorialrepublic.com/javascript-tutorial/javascript-strict-mode.php
  2. MDN:Strict mode:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

<<:  GPU程序设计(2) -- 多执行绪

>>:  Windows 10 环境 MINGW64 找不到 PGP Keys 的问题 (Gpg4win)

Day-10 回圈

正如人需要重复呼吸。在程序中,多数时候都与「重复进行某动作」有关,而这,就是回圈。视执行次数、过程与...

如何使用WYSIWYG Python GUI 设计工具快速设计出子视窗及产出程序码呢?

Python GUI中如果只有一个主视窗那将会很不好用,那该如何快速设计出不同的子视窗呢? 网路上有...

Day 19 Method

Method程序设计中,可以说是将程序模组化,这样有助於加速程序的开发、便於分析与维护等,如果要重复...

数据分析的好夥伴 - Python基础:资料形式(上)

在学习完SQL之後,接下来让我们进入下一个阶段:Python的学习! 先说为什麽你需要学Python...

Day27 ATT&CK for ICS - Collection(3)

T0861 Point & Tag Identification 攻击者收集环境内部的 po...