国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 代碼預解析/變量和函數的聲明

2019-11-06 06:02:31
字體:
來源:轉載
供稿:網友

1. 代碼預解析

所謂預解析,指的是在執行之前對代碼的分析,檢查看是否有錯誤,然后對變量進行提升。因此在預解析的時候,js 引擎做了兩件事,① 檢查語法是否有問題;② 提升聲明預解析的過程:① 當瀏覽器打開后,會讀取 html 等文件,同時讀取 js 的代碼,以字符串的形式進行讀取;② 在瀏覽器內部有一個被稱為 js 引擎的東西(v8 引擎),它會讀取該字符串,并將其解析成可以執行的代碼(javaScript 引擎 就是將 js 形式的字符串轉換為可以使用的代碼,可以執行的代碼的應用程序);③ 在解析的過程中,首先會將代碼通篇讀取一遍,這就是預解析。在預解析過程中檢查錯誤,出現錯誤就會報錯(注意不是異常),同時會將所有的聲明記錄下來;④ 在預解析沒有問題的時候,才會從頭開始一步一步的解釋執行代碼。

2. 什么是聲明

聲明的含義原本是,告知以讓大家都知道有什么存在。在 js 中的聲明是指:① 變量 ② 函數變量的聲明是讓計算機在使用某變量的時候,知道用什么東西;函數的聲明是讓計算機在調用函數的時候,知道執行什么代碼。
console.log(num);//報錯,num is not defined,此錯誤在執行時出現,而非預解析時出現如何聲明?(1)聲明變量
var num;注意:① 重復聲明無效② 如果變量賦值,沒有使用 var,那么會稱為全局變量(注意:嚴格模式中報錯)
"use strict"; //嚴格模式③ 連續聲明多個變量時一定要注意符號
var num1, num2, num3, num4;//不要少了符號var num1 = 1,num1 = 1,num1 = 1,num1 = 1;(2)函數聲明
function 函數名() {    // 函數聲明}同時需要注意:函數聲明必須獨立于語句,成為一個單獨的代碼結構,只允許出現在全局范圍內函數中的全局范圍內
if(1){    function f() {        //不是聲明    }}
function foo(){    function f() {        //在函數內聲明    }}

3. 什么是記錄聲明

(1)代碼片段1
foo();function foo() {    console.log('ok');}代碼在執行之前會先預解析,檢查到有函數聲明,因此在執行代碼之前,js 引擎就知道有函數 foo 了,因此在執行代碼時調用 foo 就不會報錯。(2)代碼片段2
foo();//foo is not defined+function foo() {    console.log('ok');}函數不是一個獨立的存在,是一個和 + 連接的表達式,因此在預解析的時候沒有檢查到聲明,因此瀏覽器不會記錄函數,在第一次調用的時候就會出現錯誤。(3)代碼片段3
foo();//foo is not a functionvar foo = function () {    console.log('ok');};在代碼執行之前,預解析檢查到有 foo 聲明(變量),因此記錄變量 foo在代碼執行的第一句調用函數(此時還未賦值),報錯,foo不是一個函數(4)在預解析的時候,記錄聲明由兩部分構成① 如果是變量聲明,那么就記錄下變量名,并且將其值確定為 undefined② 如果是函數聲明,要記錄函數名和函數體首先在內存記錄下有一個名字,和變量名的聲明此時的規則是一樣的;緊接著記錄下函數體,將函數名和函數體聯系在一起練習:
console.log(a);//打印函數體a();//'a'var a = 10;a();//報錯,a is not functionfunction a(){    console.log('a');}a();//報錯,a is not functionconsole.log(a);//10代碼分析:① 預解析,檢查到有聲明,變量與函數首先預解析到有變量a存在,因此記錄下a這個名字,和其值undefined;接著預解析到有函數a聲明,記錄下函數名a,但是發現已經記錄了一個a,因此該操作無效,將函數體與a這個名字相關聯,解析完畢。② 開始逐步執行代碼賦值語句,執行給a重新賦值為10,將存儲的關聯函數覆蓋;執行console.log打印,打印出a的值,由于a中存儲的是數字10,因此打印10③ 分析完代碼后,將上述代碼轉換成下列形式(注意:不是所有代碼都可以這樣轉換)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 札达县| 庆云县| 武功县| 承德市| 盐边县| 怀宁县| 崇信县| 德州市| 拉孜县| 康马县| 久治县| 寿光市| 芜湖市| 沁水县| 芮城县| 尚义县| 宜君县| 西华县| 克东县| 宜黄县| 无极县| 重庆市| 安庆市| 湘乡市| 杭锦后旗| 开远市| 涿州市| 湖口县| 耿马| 蛟河市| 龙海市| 邓州市| 通江县| 名山县| 蚌埠市| 塔城市| 东至县| 钦州市| 鄯善县| 合江县| 江川县|