JS 預解釋相關理解

来源:http://www.cnblogs.com/supershare/archive/2016/06/27/5620942.html
-Advertisement-
Play Games

1、JS中的記憶體空間分為兩種:棧記憶體、堆記憶體 棧記憶體:提供JS代碼執行的環境;存儲基本數據類型的值; ->全局作用域或者私有的作用域其實都是棧記憶體 堆記憶體:存儲引用數據類型的值(對象是把屬性名和屬性值存儲進去,函數是把函數體中的代碼當做字元串存儲進去) 2、當瀏覽器載入我們HTML頁面的時候,首先會 ...


1、JS中的記憶體空間分為兩種:棧記憶體、堆記憶體
棧記憶體:提供JS代碼執行的環境;存儲基本數據類型的值; ->全局作用域或者私有的作用域其實都是棧記憶體
堆記憶體:存儲引用數據類型的值(對象是把屬性名和屬性值存儲進去,函數是把函數體中的代碼當做字元串存儲進去)

2、當瀏覽器載入我們HTML頁面的時候,首先會提供一個供JS代碼執行的環境->全局作用域(global->window)

3、在JS代碼執行之前,瀏覽器還需要自己做一些事情:把所有帶var/function關鍵字的進行提前的聲明或者定義 ->"預解釋"(變數提聲)
聲明(declare) -> 告訴瀏覽器我有這樣一個東西啦,例如 var num1; function fn;
定義(defined) -> 給我們聲明的變數或者函數賦值,例如 num1=12; fn=function(){}
[重要]變數只聲明沒有定義,預設的值是undefined(未定義)

4、var和function在預解釋階段處理是不一樣的
var -> 在預解釋的時候只是提前的聲明瞭這個變數,只有當代碼執行的時候才會完成賦值操作
function -> 在預解釋的時候會提前的把聲明加定義都完成了(在代碼執行的時候遇到定義的代碼直接的跳過)
[重要]剛開始只對window下的進行預解釋,fn函數中目前存儲的都是字元串,所以var total沒啥實際的意義,所以不進行預解釋 -> "預解釋是發生在當前作用域下的"

console.log(obj);//->undefined
var obj = {name: "張珊珊", age: 10};
function fn(num1, num2) {//代碼執行到這一行的時候直接的跳過,因為在預解釋的時候我們已經完成了聲明加定義
var total = num1 + num2;
console.log(total);
}
var num1 = 12;

fn(num1, 100);//執行fn,把全局變數num1的值賦值給形參num1,把100賦值給形參num2

5、在全局作用域下聲明的變數是全局變數
在私有作用域中聲明的變數是私有變數;函數的形參也是私有的變數;

如何分辨函數中出現的變數是私有的還是全局的?
首先看是否為形參,然後看是否在私有作用域中聲明過(有沒有var過),兩者有其一就是私有的變數,那麼在當前函數中不管什麼位置出現都是私有的,和全局的沒有半毛錢的關係;如果兩者都沒有,說明不是私有的,則往其上一級作用域進行查找...


6、函數執行的時候會形成一個新的私有的作用域(棧記憶體),供函數體中的代碼執行;
1)給形參賦值
2)私有作用域下的預解釋
3)私有作用域下的代碼執行
形成的新的私有的作用域還保護了裡面的私有變數不受外界的影響,我們把函數的這種保護機制->"閉包

區別:帶var的可以在代碼執行前進行聲明,而不帶var的不能提前的聲明

 

1、不管條件是否成立都要進行預解釋
window預解釋:var a; -> window.a;
if (!("a" in window)) {//"a" in window -> true
var a = "我們";
}
console.log(a);//->undefined

2、預解釋只發生在"="的左邊,只把左邊的進行預解釋,右邊的是值是不進行預解釋的

匿名函數之函數表達式:把函數定義的部分當做值賦值給一個變數或者元素的事件
預解釋的時候:var fn; ->fn的預設值是undefined
fn();//->undefined() Uncaught TypeError: fn is not a function JS中只有函數可以執行 && JS上面的代碼如果報錯了,在不進行任何的特殊處理情況下我們下麵的代碼都不在執行了
var fn = function () {
console.log("ok");
};
fn();

預解釋的時候:fn=xxxfff000
fn();//->"ok"
function fn() {
console.log("ok");
}
fn();//->"ok"


3、函數體中return下麵的代碼都不在執行了,但是下麵的代碼需要參加預解釋;而return後面的東西是需要處理的,但是由於它是當做一個值返回的,所以不進行預解釋;
var total = 300;
function fn() {
console.log(total);
return function sum() {};//return是把函數中的值返回到函數的外面,這裡是把function對應的記憶體地址返回的到函數的外面,例如:return xxxfff111;函數體中return下麵的代碼都不在執行了
var total = 10;
}
fn();

4、匿名函數的function在全局作用域下是不進行預解釋的
匿名函數之自執行函數:定義和執行一起完成了
(function(num){})(100);
5、在預解釋的時候,如果遇到名字重覆了,只聲明一次,不重覆的聲明,但是賦值還是要重覆的進行的
在JS中變數的名字和函數的名字如果一樣是算作重覆的
預解釋:
var fn; 聲明
fn = xxxfff000; [聲明]不要了+定義
fn = xxxfff111; [聲明]不要了+定義
->fn=xxxfff111
var fn = 12;//window.fn=12
function fn() {//window.fn=function(){}
}
function fn() {
}


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

-Advertisement-
Play Games
更多相關文章
  • #include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo) { //cout << " ...
  • 近日,Yelp的SRE工程師Dmitriy Samovskiy發表了一篇標題為 《新時代的運維》 的文章,文章中他簡要介紹了在雲計算大環境下,運維工作重心和角色的變化。 其實在6年前,Dmitriy就寫過一篇關於 DevOps趨勢 的文章,在那篇文章中,他認為系統管理人員需要具有簡單腳本之外的開發能 ...
  • for...in迴圈在運行時出錯了錯誤,並沒有要求枚舉對象的修改與當前保持一致。事實上,ES對併發修改在不同js環境下的行為的規範留有餘地。標準規定: 如果被枚舉的對象在枚舉期間添加了新的屬性,那麼在枚舉期間並不能保證新添加的屬性能被訪問。 上面規範的實際後果:如果我們修改了被枚舉的對象,則不能保證... ...
  • 3.事件和動畫 A. 事件 Aa. DOM載入 1.為什麼使用jQuery載入DOM方法? 以javascript的window.onload()方法載入DOM的先決條件是:必須等待被請求頁面的資源全部載入完成,才會為DOM元素添加事件行為;而jquery只要DOM元素載入完成,就立刻綁定事件 2. ...
  • //獲取到當前時間 Date date=new Date(); DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time=format.format(date); ...
  • <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="jquery.js"></script> </head> ...
  • <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="jquery.js"></script> </head> ...
  • 使用sui mobile做的選擇控制項,其中sm.js有修改,增加自定義api,詳情請看index.html的註釋,不多說了,上代碼 引用文件及demo:http://pan.baidu.com/s/1i5tuuzz ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...