ECMAScript5之StrictMode

来源:http://www.cnblogs.com/giggle/archive/2016/03/08/5252185.html
-Advertisement-
Play Games

通過demo對ECMAScript5中的嚴格模式(StrictMode)進行了學習併列舉出了幾個重要的限制條件


ECMAScript5引入一個嚴格模式的概念(Strict Mode)。

它的作用就是不讓Javascript的容錯那麼高,讓我們對編寫代碼的規範要求高一點。

比如,當我們使用嚴格模式編寫JavaScript代碼時,我們不能隱式的申明變數,必須帶var。

那怎麼使用嚴格模式(Strict Mode)呢?

當我們想讓代碼啟動嚴格模式(Strict Mode)時,我們可以在代碼的開頭或者函數function的開頭中添加”use strict”。

倘若我們在整個代碼中啟用嚴格模式(Strict Mode),那麼所有代碼都必須遵循嚴格模式的規範;

倘若我們在一個function中啟用,那麼只在這個function中,得遵循嚴格模式的規範。

我們一起來寫個demo,體驗體驗下。

<!DOCTYPE html> 
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            //啟用嚴格模式
            "use strict";
            function testFunction(){
                var testvar = 4;
                return testvar;
            }
            //This causes a syntax error.
            testvar = 5;
        </script>
    </body>
</html>

在上面的demo中,我在整個代碼中啟用嚴格模式,但我在function的外部聲明變數時,沒有加var,因此不符合嚴格模式規範,所以運行代碼時會報錯。

哈,有點意思。

剛纔我們是在整個代碼中啟用嚴格模式,下麵我們再來寫個demo,在function里啟用嚴格模式。

<!DOCTYPE html> 
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function testFunction(){
                "use strict";
                testvar = 4;
                return testvar;
            }
            testvar = 5;
        </script>
    </body>
</html>

打開chrome調試器:

納尼!!怎麼沒有報錯?!!

我們再看看上面的代碼,哈哈哈,原來是我們沒有調用testFunction嘛,既然沒執行它,它怎麼會啟用嚴格模式呢?

修改代碼如下:

<!DOCTYPE html> 
    <head>
        <title>strict mode</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function testFunction(){
                "use strict";
                testvar = 4;
                return testvar;
            }
            //調用testFunction
            testFunction();
            testvar = 5;
        </script>
    </body>
</html>

再看看chrome結果:

哇咔哇咔,嚴格模式還是挺嚴格的嘛,如果我們在寫代碼中,想啟用的嚴格模式,那就得註意咯。

下麵列舉了在嚴格模式下的幾個重點限制:

JavaScript

限制

例子

變數

使用一個變數,但是沒有用var去聲明

    testvar = 4;

delete

刪除一個變數,函數或者agrument

    var testvar = 15;

    function testFunc(){}

    //causes fault

    delete testvar;

    delete testFunc;

屬性名

在聲明對象時,重覆使用一個屬性名

    var testObj = {

         prop1: 10,

         prop2: 15,

        //causes fault

        prop1: 20

    }

參數名

在函數參數中,重覆使用一個參數名

function testFunc(param1,/*causes fault*/param1){

    return 1;

}

有潛力成為關鍵字

在未來有可能成為有用的關鍵字,不能用來作為變數名或者函數名

    implements

    interface

    package

    private

    protected

    public

    static

    yield

八進位數

將八進位數賦給一個變數

    var testoctal = 010;

    var testescape = \010;

this

當this為null或者undefined的時候,它是不能被轉換成全局對象(window)的

    function testFunc(){

        return this;

    }

    var testvar = testFunc();

在不是嚴格模式下,這個testvar的值是全局對象,但在嚴格模式下,它的值卻是undefined.

eval,arguments

eval,arguments不能作為函數名或者參數名、變數名

    var eval = 10;

    var arguments =10;

arguments

在函數中,我們不能通過改變arguments,來改變對應參數值

    function testArgs(oneArg){

        arguments[0] = 20;

    }

在非嚴格模式下,我們如果想改變oneArg,可以通過Arguments[0]來改變,如上代碼這樣,執行後,oneArg和Arguments[0]的值都是20;但是在嚴格模式下,我們不能通過arguments來改變參數名的值,arguments僅僅是一個拷貝而已。

arguments.callee

不允許這麼使用

    function(testInt){

      if(testInt-- == 0){

          return;

         }

         arguments.callee(testInt);

     }


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近階段一直在查看項目里所使用到的一些技術點,發現了gearman,於是就動手搞了下環境,下麵是來自百度百科關於gearman的介紹: Gearman是一個用來把工作委派給其他機器、分散式的調用更適合做某項工作的機器、併發的做某項工作在多個調用間做負載均衡、或用來在調用其它語言的函數的系統。 可用於...
  • atitit.TokenService token服務模塊的設計 1. Token的歸類1 2. Token的用途2 2.1. 訪問控制2 2.2. 編譯原理術語)編輯2 2.3. 數據處理2 1. Token的歸類 Token, 令牌,代表執行某些操作的權利的對象 訪問令牌(Access toke
  • Atitit.atijson 類庫的新特性設計與實現 v3 q31 1. V1版本---集成了多引擎1 2. V2版本新特性 --bsh腳本化2 3. V3版本新特性---迴圈引用解決使用fastjson2 4. prob目前jsonlib庫的存在的問題,2 4.1. 可能版本衝突,拋出ex2 4.
  • Atitit.跨語言 文件夾與文件的io操作集合 草案 1. Jdk原生的太難用了。。1 2. PS: apache commons-io包,FileUtils有相關的方法,IOUtils一般是拷貝文件。1 3. Java raw3 4. 獲取磁碟分區列表 驅動器列表4 5. ref4 1. Jdk
  • 最近一個項目用到Redis做數據緩存,使用Redis最重要的是寫配置文件,那麼要瞭解它的各個配置參數含義,今天整理了一下,發現有些參數不太明白,特貼出來請大家幫忙看看。 daemonize <yes|no>:是否以後臺daemon方式運行 # yes|no (default:no) pidfile
  • 這篇文章主要介紹了正則表達式表單驗證實例詳解的相關資料,大家可以參考下。首先給大家解釋一些符號相關的意義 * 匹配前面的子表達式零次或多次; ^ 匹配輸入字元串的開始位置;$匹配輸入字元串的結束位置 1. /^$/ 這個是個通用的格式。 2. 裡面輸入需要實現的功能。 \d 匹配一個數字字元,等價於...
  • 1 JavaScript中的with語句的作用是為逐級的對象訪問提供命名空間式的速寫方式, 也就是在指定的代碼區域, 直接通過節點名稱調用對象 初次接觸到with用法,是這樣一段代碼: 1 2 3 4 5 6 7 8 9 10 11 12 function validate_email(field,
  • css3背景顏色漸變屬性 相容性測試基礎環境為:windows系統;IE6.0+, Firefox4.0+, Chrome4.0+, Safari4.0+, Opera15.0+ 語法: <linear-gradient>:linear-gradient([ <point>,]? <color-st
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...