針對JS經典題型對全局變數及局部變數的理解淺談

来源:http://www.cnblogs.com/heiyou-blog/archive/2016/08/21/5793437.html
-Advertisement-
Play Games

第一次寫博,還蠻激動。。。 看到了三題經典題型,經老師講解後,對此類題目有了更深刻的認識 就我目前的認識對此題進行總結。如有錯誤,敬請指正 首先,我們先明確一下JS引擎的工作步驟: js引擎工作分為兩步: 1.將這個js中的變數和函數聲明保存到當前(註意,是當前)執行環境的變數對象中 2.再逐行解析 ...


 

第一次寫博,還蠻激動。。。

看到了三題經典題型,經老師講解後,對此類題目有了更深刻的認識

就我目前的認識對此題進行總結。如有錯誤,敬請指正

首先,我們先明確一下JS引擎的工作步驟:

js引擎工作分為兩步:

 1.將這個js中的變數和函數聲明保存到當前(註意,是當前)執行環境的變數對象中

 2.再逐行解析執行js。當看到一個函數或一個變數時,js引擎就會去查詢 這個函數或變數是在哪裡定義的

查詢的方式有兩種:

 a.按作用域鏈查找:先在當前執行環境查詢這個變數或程式,如果沒有,就到父執行環境 中查找,還沒有就繼續向上查找,一直到window

 b.從對象中查找:如果一個函數是用對象來調用的,就可以從這個對象中查找,如果 在執行環境中沒有找到,會報錯,如果在對象中沒有找到,會返回undefined

照我個人的理解:每一個函數都是一個獨立的執行環境,在每一個執行環境中,都有兩個工作步驟,也就是1和2,下麵就題目分析

第一題:

1 var a = 10;
2 function test(){
3   a = 100;
4   alert(a);
5   alert(this.a);
6   var a;
7   alert(a);
8 }
9 test();

答案:100 10 100

就代碼解析:函數的工作域是window,首先進行第1步:將變數和函數聲明保存到當前執行環境的變數對象中,個人對此句話的理解是:引擎工作的第一步是將變數和函數的聲明提前,相當於:

var a;
var test;

之後開始第2步:逐行解析執行js,首先將10賦值給a,然後跳過沒有自執行的test函數,開始第9句,第9句是一句對test()函數調用,執行環境要註意是window,因此,test函數中的this指向的必然是window。進入test函數內部,與開始時的步驟相同,第一步,將變數及函數聲明提前至解析函數之前,即:

var a;

之後開始對函數內代碼逐條執行,首先將100賦值給a,則此時,a 結果為100;而this指的是調用此函數的對象,由第9句,由上述的分析知this指的是window,因此this.a 指的是window中的變數a,其值為10,因此第5句結果為10;第六句在test解析時就被提前了,所以可直接跳到第7句,此時的a指向的還是函數內部的變數a,因此結果為100。

第二題:

1 var a = 100;
2 function test(){
3     alert(a);
4     var a = 10;
5     alert(a);
6 }
7 test();

答案:undefined 10

就代碼解析:函數的工作域是window,依舊是進行第1步:

var a;
var test;

之後進行逐行解析,第1行將100賦值給a,第7行調用此函數,在被調用的函數test()內,首先有

var a;

第2步,逐行解析,a在其執行環境中已經被定義,所以不會有是全局變數的可能,但因第一步只是把變數聲明提前,而非將其賦值,因此在第3句中,a是一個聲明但未初始化的值,因此其結果為undefined。第4句將10賦值給a,因此第5句結果為10。

第三題:

1 var a = 100;
2 function test(){
3     alert(a);
4     a = 10;
5     alert(a);
6 }
7 test();
8 alert(a);

答案:100 10 10

 就代碼解析:函數的工作域是window,依舊是進行第1步:

var a;
var test;

逐行解析:第1行將100賦值給a,第7行調用此函數,在被調用的函數test()內,第一遍並沒有變數聲明或函數聲明,因此進入第2步,依舊是逐行解析,第3行,a在其執行環境中並無聲明,由開頭介紹的js引擎的第2步a中介紹,先在當前執行環境查詢這個變數或程式,如果沒有,就到父執行環境 中查找,還沒有就繼續向上查找,一直到window。因此a在test中並非局部變數,而是window的全局變數,即a的結果是100;第4行中,全局變數a的值修改為10,因此第5行結果為10;在函數結束後,全局變數a的值已經被修改為10,因此第8行結果為10。


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

-Advertisement-
Play Games
更多相關文章
  • 1.什麼是php PHP,即“Hypertext Preprocessor”,是一種被廣泛應用的開源通用腳本語言,尤其適用於 Web 開發並可嵌入 HTML 中去。它的語法利用了 C、Java 和 Perl,易於學習。該語言的主要目標是允許 web 開發人員快速編寫動態生成的 web 頁面。對於像微 ...
  • scjson純c json引擎, 補充了可以在json串或文件中添加註釋的功能. window和linux測試完畢. ...
  • Python中的變數不需要聲明,每個變數使用前必須賦值,變數賦值後才會被創建,在Python中變數就是變數,它沒有類型。我們所說的"類型"是變數所指的記憶體中對象的類型。 等號(=)用來給變數賦值,等號(=)運算符左邊是變數名,等號(=)運算符右邊是存儲在變數名中的值。例如: 執行以上程式會輸出以下結 ...
  • 好不容易寫出來一些程式,最後各種錯誤,就是運行不了。最後還得乖乖的 打斷點 ,運用 輸出語句,找出問題具體在什麼地方,進行修改。 1、從本地找cookie。IE-工具-Internet選項-瀏覽歷史紀錄-設置-查看文件。和從C盤找結果是一樣的。 2、簡單設置編碼。 Myeclipse-Windows ...
  • 1.前言 前面講了一些關於python的一些基本的語法及語句,在這個地方繼續講python的方法及其python核心概念的面向對象。我們都知道python被稱為面向對象的語言,那麼在這裡我們將正式的接觸 的python的核心。 2.函數 定義:是可調用的,執行某種行為並返回一個值。判斷一個函數是否可 ...
  • 緩存集群管理 系統化管理資源、節點,統一緩存版本,開發人員無需關心底層基礎設施,簡化 運維複雜度,提供統一的系統化運維監控管理。 自動化運維部署平臺 應用監控 開源項目 總結 用自動代替人工; 用小系統驅動打團隊; 用基礎平臺支撐上層應用。 --------... ...
  • fsbanner是一款自定義功能豐富的響應式網站Banner手風琴特效jQuery插件。該手風琴特效相容性很好,支持點擊和滑鼠滑過等觸發事件,並且可添加標題或描述。 線上實例 使用方法 複製 複製 參數詳解 下載 ...
  • 工程下安裝XTemplate並使用它的方法實例說明: 1.安裝xtpl npm install xtpl xtemplate --save 2.在views目錄添加test.xtpl文件,其內容為 this is {{title}}! 4.集成到Express中,只需要在app.js中,設置模板引擎 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...