知玩家們對FC游戲《忍者龍劍傳3》是否還有印象,在這個游戲的第二個關卡中隼龍通過沙漠時需要經過一個巖漿地帶,巖漿一直不斷往上升,必須在巖漿淹沒之前到達頂部,否則將會被巖漿吞沒,在逃離的過程中存在著各種阻礙,這個部分有點類似跑酷游戲。在近期有一款名為《直排輪大冒險》(Adventure Roller Skates)就是在類似的場景中進行的,游戲即將在今年秋季發布,先來看一下游戲的視頻吧~
視頻:http://v.youku.com/v_show/id_XMTI5NzY4NDY2NA==.html
在游戲中玩家操縱著一名穿著直排滑輪的冒險家,需要逃離充滿危險機關的古代遺跡,在逃離的過程中會遇到巖漿的追逐,各種方向的飛箭以及方塊的擠壓等等。游戲整體給人的感覺也比較懷舊,游戲場景中出現的圖騰不經讓人想起祖瑪這個詞,再加上整體的整體畫風,滿滿的懷舊情感。游戲的操作方式是屬于比較簡單,由于人物是自動奔跑的,所以玩家只需要控制人物奔跑的方向,不過面對那么對陷阱,想要玩好也是有點難的。
官方表示游戲將在今年秋季上架,現在夏日也快結束了,玩家們很快就可以玩上這款有趣的跑酷游戲了。
構建網頁和網站的過程中,存在一種神奇的協作,那就是HTML、CSS和JavaScript這"三劍客"的組合。這三種語言是前端開發的核心,對于任何希望成為前端開發者的人來說,掌握這三種語言是基礎中的基礎。本文將會詳細解析這三種語言的功能和它們在前端開發中的作用。
首先,HTML,或超文本標記語言,是構建網頁結構的基礎。它允許我們創建和格式化網頁內容。HTML用于定義網頁的內容,例如段落、標題、列表或者圖片等等。HTML元素被定義為帶有尖括號的標簽,如<body>、<head>、<title>等。
其次,CSS,即層疊樣式表,負責網頁的表現和布局。如果說HTML是房子的骨架,那么CSS就是房子的外觀設計和裝潢。它可以定義字體、顏色、間距、大小甚至動畫等等,使得網頁看起來更加美觀。
最后,JavaScript,它是實現網頁交互的關鍵。JavaScript可以用來編寫函數,響應用戶的行為,如點擊按鈕、滑動滾輪、填寫表單等等。JavaScript也可以用來動態修改HTML和CSS,創建動態和交互性的網頁。
當然,HTML、CSS和JavaScript并不是各自獨立存在的,它們需要緊密地配合工作。例如,我們可以在HTML中插入CSS,以改變內容的外觀。我們也可以用JavaScript來修改HTML內容,或者改變CSS樣式。這種緊密的配合,使得我們的網頁既有結構,又有美觀的設計,還有豐富的交互性。
在掌握這三種語言之后,你就已經具備了成為一名前端開發者的基礎技能。當然,前端開發還有許多其他的知識和技術,如React、Vue等前端框架,以及ES6、TypeScript等現代JavaScript的新特性。但是無論如何,HTML、CSS和JavaScript都是你成為前端開發者的基石。
管理服務專家新鈦云服 林泓輝
與許多同類語言相比,JavaScript 是一種易于學習的編程語言。但是,如果您想理解、調試和編寫更好的代碼,則需要多加注意一些基本概念。
在本文中,我們將了解兩個這樣的概念:
作為一個初學者的JavaScript,了解這些概念將有助于您了解this關鍵字,作用域和閉包。
一般來說,一個 JavaScript 源文件會有多行代碼。作為開發人員,我們將代碼組織成變量、函數、數據結構(如對象和數組)等等。
語法環境決定了我們如何以及在何處編寫代碼。看看下面的代碼:
function doSomething() {
var age= 7;
// Some more code
}
在上面的代碼中,變量age在語法上位于函數內部doSomething。
請注意,我們的代碼不會按原樣運行。它必須由編譯器翻譯成計算機可理解的字節碼。通常,語法環境在您的代碼中會有多個。然而,并不是所有的環境都會同時執行。
幫助代碼執行的環境稱為執行上下文。它是當前正在運行的代碼,以及有助于運行它的一切。可以有很多語法環境,但當前運行的代碼只能有一個執行上下文。
查看下圖以了解語法環境和執行上下文之間的區別:
語法環境與執行上下文
那么在執行上下文中到底發生了什么?代碼被逐行解析,生成可執行的字節碼,分配內存并執行。
讓我們采用我們在上面看到的相同函數。您認為執行以下行時可能會發生什么?
var age = 7;
這段源代碼在最終執行之前經歷了以下階段:
下面的動畫圖片顯示了源代碼到可執行字節碼的轉換。
可執行字節碼的源代碼
所有這些事情都發生在一個執行上下文中。所以執行上下文是代碼的特定部分的執行環境。
有兩種類型的執行上下文:
每個執行上下文都有兩個階段:
讓我們詳細看看它們中的每一個,并更好地理解它們。
每當我們執行 JavaScript碼時,它都會創建一個全局執行上下文(也稱為基本執行上下文)。全局執行上下文有兩個階段。
在創建階段,創建了兩個獨特的東西:
如果代碼中聲明了任何變量,則會為該變量分配內存。該變量使用唯一key進行初始化,并賦值為undefined。
如果代碼中有function ,它會被直接放入內存中。我們將在Hoisting后面的部分中詳細了解這部分。
代碼執行在這個階段開始。在這里進行全局變量的賦值。請注意,這里沒有調用函數,因為它發生在函數執行上下文中。我們將在后面討論這個問題。
讓我們通過幾個例子來理解這兩個階段。
創建一個名為index.js的空 JavaScript 文件及一個包含以下內容的 HTML 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src='./index.js'></script>
</head>
<body>
I'm loading an empty script
</body>
</html>
我們使用<script>標簽將空腳本文件導入到 HTML 文件中。
在瀏覽器中加載 HTML 文件并打開 Chrome DevTools(快捷鍵通常為F12)或其他瀏覽器也是可以的。選擇console選項卡,鍵入window并按回車鍵。您可以看到瀏覽器的Window對象。
windows對象
現在,輸入this并按回車鍵。您可以看到和Window對象一樣的this對象。
'this' 的值
如果您輸入window === this則會得到返回值true
好的,那么我們學到了什么?
現在讓我們看一個在 JavaScript 文件中包含一些代碼的示例。我們將添加一個變量blog,并為其分配一個值。我們還將定義一個名為logBlog的函數。
var blog = 'freeCodeCamp';
function logBlog() {
console.log(this.blog);
}
在創建階段:
在執行階段:
當我們調用一個函數時,會創建一個函數執行上下文。讓我們擴展上面使用的相同示例,但這次我們將調用該函數。
var blog = 'freeCodeCamp';
function logBlog() {
console.log(this.blog);
}
// Let us call the function
logBlog();
函數執行上下文經歷相同的階段,即創建和執行。
函數執行階段可以訪問一個名為arguments的特殊值。它是傳遞給函數的參數。但在我們的示例中,沒有傳遞任何參數。
請注意,在全局執行上下文中創建的window對象和this變量仍然可以在此上下文中訪問。
當一個函數調用另一個函數時,會為新的函數調用創建一個新的函數執行上下文。每個函數中相應的變量只能在對應的執行上下文中使用。
讓我們轉到另一個基本概念Hoisting。當我第一次聽說Hoisting時,花了一些時間才理解這個意思。
在英語中,hoisting 的意思是使用繩索和滑輪提升某物。這可能會誤導您認為 JavaScript 引擎會在特定代碼執行階段拉取變量和函數。接下來,讓我們理解Hoisting的意思。
請看下面的例子并猜測輸出:
console.log(name);
var name; // undefined
然而,為什么是undefined?如果我們在其他編程語言中使用類似的代碼。在這種情況下,我們將在控制臺得到報錯,指出該變量name未聲明,而我們正試圖在此之前訪問它。但是在JavaScript的執行上下文里:
在創建階段,
在執行階段,
這種為變量分配內存并賦值為undefined在執行上下文的創建階段使用值進行初始化的機制稱為Variable Hoisting(變量提升)。
特殊值undefined意味著聲明了一個變量但沒有賦值。
如果我們為變量分配一個這樣的值:
name = 'freeCodeCamp';
執行階段會將這個值賦給變量。
現在讓我們談談Function Hoisting(函數提升)。它與Variable Hoisting的模式相同。
執行上下文的創建階段將函數聲明放入內存,并在執行階段執行。請看下面的例子:
// Invoke the function functionA
functionA();
// Declare the function functionA
function functionA() {
console.log('Function A');
// Invoke the function FunctionB
functionB();
}
// Declare the function FunctionB
function functionB() {
console.log('Function B');
}
輸出如下:
Function A
Function B
在創建階段將整個函數聲明提前放入內存稱為Function Hoisting。
既然我們了解了變量提升的概念,那么讓我們了解一些基本規則:
logMe();
var logMe = function() {
console.log('Logging...');
}
代碼執行將中斷,因為在函數初始化時,變量logMe將作為變量而不是函數被提升。因此,對于變量提升,內存分配將在初始化時發生undefined。這就是我們會得到錯誤的原因:
函數初始化時出錯
假設我們嘗試在聲明之前訪問一個變量,然后使用letandconst關鍵字來聲明它。在這種情況下,它們將被提升但不會被分配默認值undefined。訪問此類變量將導致ReferenceError. 下面是一個例子:
console.log(name);
let name;
它會拋出錯誤:
使用 let 和 const 關鍵字聲明的提升變量時出錯
如果我們使用var代替let和,相同的代碼將毫無問題地運行const。這個錯誤是因為新的JavaScript 語言的保護機制,防止意外提升可能會導致不必要的麻煩。
感謝您能看到最后,我希望這篇文章能幫助您更好的理解JavaScript中的執行上下文與變量提升的機制。
原文:https://www.freecodecamp.org/news/javascript-execution-context-and-hoisting/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。