js的解析順序 作用域 嚴格模式

来源:http://www.cnblogs.com/z937741304/archive/2017/10/22/7712646.html
-Advertisement-
Play Games

一、javascript的解析順序 我們大家所理解的代碼的執行順序都是從上到下的,但是實際上確不是這樣的。我們看一下下麵的代碼。 如果執行順序是從上到下的,在上面彈出一個a,瀏覽器會認為從上到下執行的,那麼當它alert(a)的時候,他就會發現沒有這個東西,那麼他就會報錯,但是實際上他彈出來的結果是 ...


一、javascript的解析順序

  我們大家所理解的代碼的執行順序都是從上到下的,但是實際上確不是這樣的。我們看一下下麵的代碼。

  

1 alert(a);
2 var a = 1;

  如果執行順序是從上到下的,在上面彈出一個a,瀏覽器會認為從上到下執行的,那麼當它alert(a)的時候,他就會發現沒有這個東西,那麼他就會報錯,但是實際上他彈出來的結果是undefined。返回值是undefined說明a沒有被定義也就是沒有賦值。下麵我來講解一下javascript的解析順序。

  1.ES5中有聲明意義的關鍵字

    var   會存在變數提升

    function  也有聲明變數的的作用。

  2.解析順序

    1.找聲明  var、function   聲明:只是聲明變數,而不包括賦值。

    2. 執行

    註意:以上兩步 都遵循從上至下,執行的時候遇到等號,先看等號的右邊。

    註意:當function聲明的變數和var聲明的變數重名時,function的變數權重會比var聲明的要高。

  下麵多來幾個例子解析一下就清楚許多了,但是看例子之前要知道一下什麼叫作用域。

二、作用域

  作用域就是:起作用的範圍分為下麵兩種

  1.全局作用域

  2.函數作用域

    他們兩個的區別看下麵的例子仔細分析。

三、看幾個例子解析一下執行順序的步驟

 1. 第一個例子:

var x = 5;
    a();
    function a(){
        alert(x);
        var x = 10;
    }
alert(x);

  解析過程

  1,.尋找聲明   (看全局作用域)

    var x;

    function a(){} 

  2.執行

    x = 5;

    a()  ------------->執行到這個函數的過程中在重新進行以上兩步

            1,尋找聲明 var x;  (函數作用域)

            2. 執行

              alert(x);  這個x在函數作用域中存在,並且還沒有執行到賦值的那一步,那麼彈出的東西就是undefined;

              x = 10;

    alert(x)    這裡彈窗是全局變數  5;    

  所以瀏覽器彈窗的內容是   undefined  5

 2. 第二個例子

 a()
 function a(){
    alert(x);
    var x = 10;
 }
alert(x);

  解析過程 按照上面的例子一樣分析

  1. 尋找聲明

   function a(){}

  2.執行

   a()------------------------->函數

            1.尋找聲明

              var x;

            2.執行

              alert(x)    彈出未定義

              x = 10;

  alert(x);  這裡的x會從全局中尋找x,但是發現並沒有x,所 以瀏覽器會 報錯     x is not  defined x沒有被定義

  所以瀏覽器的彈出的內容是  undefined  報錯

 

  我相信看了這兩個例子的人都對這個解析過程都有了清除的瞭解,如果還是不太瞭解,建議重新看一次。

  下麵介紹幾個需要註意的地方, 直接上例子

 3. 第三個例子

  前面講到了當function聲明的變數和var聲明的變數重名時,function的變數權重會比var聲明的要高。來一個例子證明一下

  

alert(a)

function a() {
    alert("函數")
}

var a = 1;  
alert(a)

  解析過程

  1.尋找聲明

   function a(){}

   var a;

  2. 執行

    alert(a) 前面說到了function的聲明比var聲明的權重高,所有執行這個的時候他會彈出這個 函數塊(函數體)

    a = 1;

    alert(a);     這裡彈出的就是 1 了

  所以最後的結果就是 函數塊 1;

 4.第四個例子

  子作用域可以向父級作用域找變數,直到全局作用域為止,反之不行。 如果子作用域有同樣的變數,那麼他就會使用自己的,不會去找爸爸要。

  

var a = 5;

function fn() {
    alert(a)
}

fn()

  解析過程

  1.尋找聲明

    var a;

    function fn(){}

  2.執行

    a = 5;

    fn()--------------------------------------> 函數

                    1.找聲明

                    2.執行

                     alert(a);  他這裡沒有a 所以去找爸爸要。  a = 5;   所以彈窗是  5

  所以最後結果為  彈窗5

  下麵看一下爸爸會不會去找兒子要東西

function fn(){
    var b = 5; 
    return b;    
}
fn();
alert(b);

  1.尋找聲明

    function fn(){}

  2. 執行

    fn()----------------------------------------> 函數

                      1.尋找聲明

                        1.var b;

                      2.執行

                        return b;

  alert(b);   //我們看一下返回值是多少   b is not defined   他說b沒有被定義,說明父作用域不可以向自作用域去尋找變數。

 

 5. 第五個例子

  當一個變數無中生有時,不管從哪個作用域出來的,統統歸到window下,下麵看兩個例子

  

  fn();
  alert(a);
  var a = 0;
  alert(a);
  function fn(){
     var a = 1;
  }

這一個例子應該可以自己分析了  最後的結果是  undefined   0

我們再來看一下下麵這個你會很吃驚

  fn()
  alert(a)
  var a = 0;
  alert(a);
  function fn(){
      a = 1;
  }

  明明都一樣,我吃驚什麼 返回值不是還是 undefined 和 0 嗎

  但是你有沒有發現倒數第二行 上面的聲明瞭 下麵的沒有聲明,來解析一波

  1.尋找變數

    var a;

    function fn(){}

  2.fn()---------------------------->函數

          a = 1;  這個時候就說到了那一點,無中生有的變數,統統歸到window下麵

  所以下麵的執行過程

  alert(a)    這裡的彈窗就是  1 了

   a = 0;

     alert(a)   彈出 0

  所以最後的結果是   1       0 

四、嚴格模式

  嚴格模式下的代碼執行時,非常嚴格

  變數不允許無中生有

  意義:規範代碼開發的流暢,邏輯

  

"use strict"
a = 1;
alert(a);

當我們寫後面兩句代碼的時候不會報錯和出現問題,但是當我們加上第一句代碼的時候,我們在這樣寫的時候就會報錯了。所以我們還是按照規範的標準來,提高自己的能力

五、可能好多人做了上面的例子感覺不太過癮,下麵我再給出幾個例子,可以自己去分析分析,我會在最後面給出答案。

1. 第一個例子    //  10 報錯

var a = 10;
alert(a);
a()
function a(){
    alert(20);
}

2.第二個例子   undefined 1 0

var a = 0;
    function fn(){
        alert(a);
        var a = 1;
        alert(a);
    }
    fn();
    alert(a);

3.第三個例子 當同樣的聲明同樣的名字重覆時,後面寫的會覆蓋前面寫的  //2  1  1  3

 a()
    var a = function(){
        alert(1)
    }
    a();
    function a(){
        alert(2);
    }
    a();
    var a = function(){
        alert(3);
    }
    a()

 如果你看到我的文章可以收穫一些知識,那麼我會非常高興的。

 


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

-Advertisement-
Play Games
更多相關文章
  • InputStream is = null;try { is = new FileInputStream(textPath); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 512); / ...
  • 1.功能簡介 此程式模擬員工信息資料庫操作,按照語法輸入指令即能實現員工信息的增、刪、改、查功能。 2.實現方法 架構: 本程式採用python語言編寫,關鍵在於指令的解析和執行:其中指令解析主要運用了正則表達式來高效匹配有效信息;指令執行通過一個commd_exe主執行函數和增、刪、改、查4個子執 ...
  • [摘要] 對 Base64 編碼的簡介,常用場景舉例,編、解碼流程,以及如何在 Python 中使用 Base64編碼與解碼 ...
  • FIRSTCRM 學員管理開發需求: 1.分講師\學員\課程顧問角色, 2.學員可以屬於多個班級,學員成績按課程分別統計 3.每個班級至少包含一個或多個講師 4.一個學員要有狀態轉化的過程 ,比如未報名前,報名後,畢業老學員 5.客戶要有咨詢紀錄, 後續的定期跟蹤紀錄也要保存 6.每個學員的所有上課 ...
  • 縱觀現狀:大學是一個自由的小社會,無憂無慮,天真爛漫,然而當你正式步入社會,你會漸漸明白“你今後人生的艱難,恰恰是在一個能讓自己自由充分成長的黃金四年裡,卻把自己荒廢了”。難道我們非要“後知後覺”嗎? 展望未來:如果你以後有意從事編程的相關工作,你應該要知道,在找工作時和其他競爭者拉開差距的,起絕對 ...
  • 關鍵資源 關鍵資源總是有限的,也就意味著處理能力也有限,所以當面對大量業務時,為了保障自己能夠有序的提供服務最經濟的做法就是限制同一時間處理的事務數。比如銀行的工作人員,一個工作人員同時只能為一個客戶服務,來多了根本處理不了,不光是一種浪費而且有可以造成混亂的局面導致工作人員無法工作。 網路請求漏斗 ...
  • 前臺: 支持三套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對伺服器負擔小 3.網站前端採用主流的響應式佈局,同一頁面同時支持PC、平板、手機(三 ...
  • 銜接上文[解讀REST] 5.Web的需求 & 推導REST,上文根據Web的需求推導出了REST架構風格,以及REST的詳細描述和解釋。自從1994年以來,REST架構風格被用於指導Web架構的設計和開發工作,最重要的兩點體現是在設計HTTP和URI兩個互聯網規範協議中,以及實現這些規範的libw ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...