1. 程式人生 > >js的解析與執行過程

js的解析與執行過程

1:預處理階段

當輸入如下程式碼時候

var a = 1;
function crli(){
    alert(a);
}
crli()//1

結果為 1

當改變下面程式碼時候

var a = 1;
function crli(){
    alert(a);
    var a = 5;
}
crli()//undefined

結果為 undefined

這是為什麼呢?

js解析與執行過程一共有2個階段,一個預處理階段,一個是執行階段(可以看成全域性預處理階段和執行階段,以及函式預處理階段和執行階段)

當js解析程式碼時候,會先建立一個lexical environme這麼一個物件,然後掃描js程式碼兩個部分:
一個是用宣告方式建立的函式,
另一個是用var 定義的變數,
然後把函式和變數的名字加到lexical environme中,比方說

1 . 全域性狀態

lexical environme(**全域性的環境物件===window**)
{
    a:undefined
    crli:對函式的一個引用
}

var a =5;
b = 1;
function crli(){

}

如果非函式宣告、非var方式宣告的變數,則預處理階段不會將函式和變數的名字加到lexical environme中
例子1:

a();//aa
b();//b is not a function

function a() {
    console.log("aa");
}
var b = function b(){
    console.log("bb"
); } lexical environme { a:對函式的一個引用 b:undefined }

例子2:

console.log(a);//undefined
console.log(b);//b is not defined
var a = 1;
b = 2;

lexical environme
{
    a:undefined
}

當遇到函式宣告有衝突時候後者會覆蓋前者,
變數宣告有衝突時候,會忽略

alert(f);//function f(){console.log("s");}
function f(){
    console.log("s");
}
var f = 5
; window { f:指向函式 }
alert(f);//function f(){console.log("q");}
function f(){
    console.log("s");
}
var f = 5;
function f(){
    console.log("q");
}
window
{
    f:指向函式
}

2 . 函式狀態

function f(a,b){
    alert(a);
    alert(b);
    var b = 100;
    function a(){
    }
}
f(1,2)//function a(){}
      //2

當遇到函式宣告有衝突時候後者會覆蓋前者,
變數宣告有衝突時候,會忽略

lexical environme           lexical environme
{                           {
    a:1                          a:指向函式
    b:2             ==>          b:2
    arguments:                   arguments:
}                           }

此時解釋

var a = 1;
function crli(){
    alert(a);
    var a = 5;
}
crli()//undefined
window 
{
    a : 1
    crli:指向函式
}
lexical environme 
{
    a:undefined
}

函式預處理
執行時,alert(a) 所以是undefind

相關推薦

js解析執行過程

js解析與執行過程分為全域性與區域性 1:全域性,預處理階段===>執行階段 2.區域性(函式),預處理階段===>執行階段  全域性:預處理  全域性的詞法環境===window{ a:undefined b:對函式的一個引用  

js解析執行過程

1:預處理階段 當輸入如下程式碼時候 var a = 1; function crli(){ alert(a); } crli()//1 結果為 1 當改變下面程式碼時候 var a = 1; function crli(){

JS解析執行過程—(全局預處理階段)

調用 ont err col 過程 預處理 報錯 彈出 error: 問題:有如下代碼 1 var a = 1; 2 function pop() { 3 alert(a); 4 var a = 5; 5 } 6 pop();//執行結果,彈

JS解析執行過程—全局預處理階段之命名沖突的處理策略

bsp env 函數表 nvi body 相同 class pre 優先級 有如下代碼: 1 <body> 2 <script> 3 alert(f); 4 5 fun

瀏覽器的解析執行過程

們的 由於 繼續 動畫 table 就會 內嵌 cnblogs 內嵌腳本 當瀏覽器獲得一個html文件時,會“自上而下”加載,並在加載過程中進行解析渲染。 解析: 1. 瀏覽器會將HTML解析成一個DOM樹(display:none,visibility:hidden)。

js解析序列化json數據

color AS 簡單 字符 IT tro 需要 strong init 一、前言:JSON對象有兩個方法:stringify()和parse()。 二、介紹:在最簡單的情況下,這兩個方法分別用於把JavaScript對象序列化為JSON字符串和把JSON字符串解析為原生J

js代碼執行過程

執行過程 ffffff 並且 fff AR 包括 變量 錯誤 會有 一:first-blood:任何程序執行的第一步總是會先檢查有沒有語法錯誤,如果有,則直接拋出語法錯誤,直接跳出, 二:second-blood:預編譯,預編譯呢會有四個執行過程,1:創建執行期上下文(AO

MyBatis實戰之解析執行 MyBatis之反射技術+JDK動態代理+cglib代理 MyBatis之反射技術+JDK動態代理+cglib代理 MyBatis之反射技術+JDK動態代理+cglib代理

本次所談的原理僅僅只涉及基本的框架和核心程式碼,並不會全部都說到,比如關於MyBatis是如何解析XML檔案和其他配置檔案從而的到內容,還有就是JDBC如何使用,關於JDBC如何使用,可以參考我的這篇部落格:單例模式和JDBC 還有就是關於Java基礎方面的內容,個人建議大家抽空看看《Java程式設計思想》

程式碼的編譯連線執行過程

 1. 編譯 一個原始檔,經過編譯系統的處理,生成目標檔案的過程叫編譯。a.cpp經過編譯後在linux下會生成a.o這個目標檔案。 目標檔案主要用來描述程式在執行過程中需要放在記憶體中的內容,這些內容包括兩大類——程式碼和資料。相應的目標檔案也分成程式碼段和資料段。

資料庫_MySQL_複雜SQL的書寫順序執行過程

寫的順序:select ... from... where.... group by... having... order by..執行順序:from... where...group by... having.... select ... order by...MYSQL

程式的編譯執行過程

本文以C程式為例。 構建C程式需要4個步驟,分別使用4個工具完成: preprocessor, compiler, assembler, and linker.四步完成後生成一個可執行檔案。 第一步,預處理. 這一步處理 標頭檔案、條件編譯指令和巨

MySQL執行計劃顯示執行過程不符合一例

一 建表和現象的過程如下 CREATE TABLE t1 (id1 INT, a1 INT, b1 INT, PRIMARY KEY(id1));CREATE TABLE t3 (id3 INT UNIQUE, a3 INT, b3 INT); INSERT INTO t1 VALUES (1, 1, NU

mybatis原理解析---SqlSession執行過程(上)

sqlSession代表與資料庫的一次會話,在這次會話中可以多次執行查詢等sql操作。從前面可以看到SqlSession物件是從SqlSessionFactory物件中獲得的。sqlSession本身就定義了一系列的update select delete in

class檔案的(解析執行過程

(1)  jvm可以理解為一個由c++所編寫的記憶體容器:包含了載入器,編譯器等。當然了,我當時最困惑的就是class是怎麼被執行的 java中的物件模型:OOP-Klass模型 OOP:普通物件指標, Kcass:java類在c++中的對等體 Kclass想jvm提供的功

js解析序列化json資料

一、前言:JSON物件有兩個方法:stringify()和parse()。二、介紹:在最簡單的情況下,這兩個方法分別用於把JavaScript物件序列化為JSON字串和把JSON字串解析為原生JavaScript。1、瀏覽器支援的轉換方式(Firefox,chrome,ope

Impala原始碼分析(2)-SQL解析執行計劃生成

Impala的SQL解析與執行計劃生成部分是由impala-frontend(Java)實現的,監聽埠是21000。使用者通過Beeswax介面BeeswaxService.query()提交一個請求,在impalad端的處理邏輯是由void ImpalaServer::query(QueryHandle

JS-預解析(提升)程式碼執行過程

  1,預解析的過程。 2,程式碼的執行過程。   預解析:程式在執行過程,會先將程式碼讀取到記憶體中檢查,會將所有的宣告在此處進行標記,所謂的標記就是讓js解析器知道這個名字,後面在使用這個名字的時候,不會出現未定義的錯誤,‘這個標記過程就是提升。   ## 宣告:

第8章2節《MonkeyRunner源代碼剖析》MonkeyRunner啟動執行過程-解析處理命令行參數

path 轉載 iss 命令 code rst pri bsp ack MonkeyRunnerStarter是MonkeyRunner啟動時的入口類,由於它裏面包括了main方法.它的整個啟動過程主要做了以下幾件事情:解析用戶啟動MonkeyRunner時從命令行傳輸

js解析器的執行原理

html 變化 ron 使用 meta utf 新的 class 而且 首先看一段代碼 <!DOCTYPE html> <html> <head> <meta charset="utf-8" />

Day4 閉包、裝飾器decorator、叠代器生成器、面向過程編程、三元表達式、列表解析生成器表達式、序列化反序列化

反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph