js預編譯四部曲,js的預編譯

本文目錄一覽:

下面js代碼 結果是什麼,怎麼解釋?

這個題類似的我遇到過,剛運行了一下,是100,10,100,關鍵是js預編譯,類似的題還有

var tt = ‘aa’;

function test(){

alert(tt); –undefined

alert(this.tt);–aa

var tt = ‘dd’;

alert(tt); –dd

alert(this.tt);–aa

一個函數被定義的時候 它的「可訪問屬性鏈」會被生成,以上函數的可訪問屬性鏈 self-window。

當它被執行的時候,首先創建函數自定義的變數(如 var a; 無論a在函數哪個地方定義,函數執行時會首先被創建,值為undifined)

函數引用到一個變數的時候,會循著「可訪問屬性鏈」查找,如果自身有定義,則不訪問window。

ps 不敢瞎解釋,僅代表個人觀點,希望有幫助

JavaScript:函數聲明與函數表達式

javascript雖然是解釋執行的語言,但也會進行預編譯。

if(condition){

function sayHi(){

alert(“Hi!”);

}

}else{

function sayHi(){

alert(“Yo!”);

}

}

這種形式,JS引擎在預編譯的過程中會註冊方法到window對象下,就是window.sayHi。

而不會顧及if else條件,導致重複的sayHi方法被註冊,在這種情況下是無效語法。

var sayHi;

if(condition){

sayHi=function sayHi(){

alert(“Hi!”);

};

}else{

sayHi=function sayHi(){

alert(“Yo!”);

};

}

而下面這種是作為一個 變數(而非函數function),變數是可以被重複賦值的,所以語法不會有問題。

不知道有沒有說清楚。

js的執行原理是什麼?

JS是解釋執行的,即讀取一個語句就執行一個。以前的嚴格JS是以分號為語句的分隔符,但現在一些瀏覽器已經接受以換行符為分隔符(似乎是很多人喜歡用基於對象的編程了,而在JS中寫對象的函數是需要加分號的,所以很多人都愛忘)。

JS本身只提供語法解析與少部分內部函數支持,其他的均由宿主支持。比如在網頁JS中的window, document, navigator等對象,均是由瀏覽器提供基於其它語言的代碼,這些代碼通常被隱藏,但很大程度上決定了JS的運行效率。如果你有興趣,打開Chrome,按F12,調處Console,然後輸alert(注意沒有()),你就會發現[native code]這個東西。

如何將javascript代碼編譯為c++或java

java是不能夠編譯C/C++文件的。他們原理完全不同。背後的運行機制也完全不一樣。

C/C++源文件只能夠用C/C++的編譯器來編譯。

以GCC編譯器為例,整個編譯可以分為四步。

第一步是預處理,包括語法檢查等工作。

gcc -P abc.c

第二步由源程序生產彙編語言代碼。

gcc -S abc.c

會生成abc.s文件,這個文件里就是彙編代碼。

第三步編譯器生成目標代碼,一個源文件生成一個目標代碼。

gcc -c abc.c

會生成abc.o

第四步連接器從目標代碼生成可執行文件。

gcc abc.o

目標代碼包括機器碼和符號表(函數及變數名)。連接器的主要作用是通過符號表在庫文件和其他模塊中找到在目標代碼中引入或未定義的符號(函數及變數名),將幾個目標代碼合成可執行文件。

JavaScript預編譯與執行順序的關係

按照代碼塊的先後順序關係,先對代碼塊進行預編譯,再執行。代碼塊指的是script標籤包含的js片段。具體如下:

step 1. 讀入第一個代碼塊。

step 2. 做語法分析,有錯則報語法錯誤(比如括弧不匹配等),並跳轉到step5。

step 3. 對var變數和function定義做「預編譯處理」(永遠不會報錯的,因為只解析正確的聲明)。

step 4. 執行代碼段,有錯則報錯(比如變數未定義)。

step 5. 如果還有下一個代碼段,則讀入下一個代碼段,重複step2。

step6. 結束。

js執行順序

你現在是先定義了函數a,然後定義了函數b,然後再去執行函數a

即使你把代碼改成這樣依舊能夠正常運行

a();

function a() {

    b();

}

function b() {

    console.log(111)

}

因為JS運行環境會把定義的代碼(變數/函數)提升到作用域的最前面

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/235760.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:56
下一篇 2024-12-12 11:56

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • JS圖片沿著SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿著SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27
  • 如何反混淆美團slider.js

    本文將從多個方面詳細闡述如何反混淆美團slider.js。在開始之前,需要明確的是,混淆是一種保護JavaScript代碼的方法,其目的是使代碼難以理解和修改。因此,在進行反混淆操…

    編程 2025-04-27
  • Python要學JS嗎?

    Python和JavaScript都是非常受歡迎的編程語言。然而,你可能會問,既然我已經學了Python,是不是也需要學一下JS呢?在本文中,我們將圍繞這個問題進行討論,並從多個角…

    編程 2025-04-27
  • 解決js ajax post 419問題

    對於使用ajax post請求時出現的419問題,我們需要進行以下幾個方面的闡述,包括返回碼的含義、可能出現的情況、解決方案等內容。 一、解析419返回碼 419返回碼錶示用戶超時…

    編程 2025-04-27
  • Three.js實現室內模型行走

    在本文中,將介紹如何使用Three.js創建室內模型,並在場景中實現行走。為了實現這一目標,需要完成以下任務: 載入室內模型及材質貼圖 實現攝像機控制,支持用戶自由行走 添加光源,…

    編程 2025-04-25

發表回復

登錄後才能評論