首頁 web前端 js教程 JavaScript預解析及相關技巧分析_javascript技巧

JavaScript預解析及相關技巧分析_javascript技巧

May 16, 2016 pm 03:04 PM
javascript 預解析

本文實例講述了JavaScript預解析及相關技巧。分享給大家參考,具體如下:

變數

同樣,以這兩個小例子的錯誤對比提示開始。

alert(y1);     //代码段1
var y1 = 'dddd';
alert(y2);     //代码段2 // alert(typeof y2);
y2 = 'xxxxx';

登入後複製

先思考一下,為什麼一個會提示 undefined , 一個卻拋出變數未定義的錯。 。先看JavaScript的解析過程。

javascript在執行過程之前,會做一件事件「預先解析」。解析引擎會以區塊為單位級別,執行所有 var 變數的創建,並賜予它們一個初始值:undefined。這樣一來,第一個例子為什麼會彈出undefined的原因就顯而易見了。

所以第一段程式碼其實等價於

var y1;
alert(typeof y1); //很自然,它此时值为undefined
y1 = 'dddd';

登入後複製

那第二段程式碼為什麼又拋錯呢,此時就不再屬於「預解析」階段了,(在這裡我假設瀏覽器遇到一個script標籤時只做兩件事:預解析和執行,其實不只這兩件事),而處於執行階段,拋錯原因在於js在執行段狀態並不知曉y2的狀態(預解析階段沒有捕獲到y2的任何資訊),當然就拋出未定義的錯誤資訊.這裡又牽扯到另一個問題: js 是弱型別語言,變數不定義可以用,那為什麼這裡又拋出為定義錯誤。

事出總有因,javascript總是有很多自身奇怪的特性,有一個叫變數的讀寫不均等。未定義的變量,僅是可寫,並不可讀。何為可寫,每個人都熟悉這樣的寫法:

y2 = 'exam';  
//在没出现它的定义操作之前(即在它还没有自己的scope之前)该操作会将这段代码认为是定义一个全局变量,在window上注册一个属性y2,并赋值为exam

登入後複製

但在對它的讀操作,js引擎搜尋不到它的任何相關信息,就以自己的脾氣行事,毫不客氣拋一個未定義的錯,這是js的遊戲規則。還有但是,那為什麼卻 可以取得它的型別呢。還記得 js對物件的操作吧。如果存取物件一個不存在的屬性及類型,會提示undefined, (因為它目前是window物件的一個屬性)。

再註:這裡需要區分, 變數的讀寫不均等 僅用於變量,讀取所有物件的屬性,不存在該特性,如果不存在,會提示undefined。

結論

到這裡,我的思考結果: 對於變數和物件的寫入操作,他們有一定的類似之處.但是讀操作,各有各的一套規則,正因為此,所以有了上面的問題。
這樣一來,下面這個題應該就很容易得到答案了吧。

if (!('a' in window)) {
  var a = 1;
}
alert(a);

登入後複製

函數

引申一下,function. 還記得上面提到的預解析,在javascript的預解析中,除了對var 變數的預定義,還包括了提取對函數的定義,所以可以在script的任何地方定義函數,在任何地方調用。不限於它之前.

但函數的定義方式,包括了一種叫字面量定義法, 用var的方法聲明function.看下面

alert(typeof y3); //结果?
var y3 = function (){ console.log('1'); }

登入後複製

還記得這個約定:呼叫必須出現在聲明之後,為什麼呢,如果理解了上面,其實這裡答案已經明了。 javascript 引擎在預先解析var 時會給他們一個初始值undefined,這樣一來,如果我們在它的聲明之前調用它,javascript 引擎還沒拿到它的真實值,自然會報"xxx is not a function"的錯.這也理清了為什麼同為函數聲明,一個卻關係到聲明和調用的順序,一個卻無這樣的約束。

結論

它是函數,是js執行,動態修改的結果,依然遵循了變數的預解析規則(在上面alert的時候,它還沒有拿到字面量函數的資訊)。
如果是兩個混合呢。看下面, 同時存在了為y4的變數和function。

alert(typeof y4); //结果?
function y4(){
  console.log('y4')
}
var y4;

登入後複製

因為javascript 在預解析時function的聲明優先級高的緣故,所以y4自然為function類型, 但是在當y4 賦值之後(此時js引擎處於執行過程中),它對js的賦值操作將會覆蓋function的聲明。所以:

alert(typeof y5);
var y5 = 'angle';
function y5(){
  console.log('ghost');  
}
alert(y5);

登入後複製

第一次alert結果,因為它處於js 執行過程中的頂端,所以為 function。 第二次再alert時, 它的值已經被重寫為5(不要被function的定義位置在下所迷惑。)

從js的解析和執行分開來想,才發現眼前豁然開朗,很多問題的答案都很自然得浮出水面,正如那篇文章作者所說,"一旦理解了執行環境、調用對象、閉包、詞法作用域、作用域鏈這些概念,JS語言的許多現像都能迎刃而解。

現在再看,即使在這個存在著許多不可思議的語言中,也有很多可以追溯到它的緣由。

如何更好的做參數判斷

討論了上面那麼多,那如何讓它更貼近於實際開發呢,既然javascript的讀寫不均等性,如何才能避免在不報錯的情況下做參數判斷呢。

eg:

if(cusVar){ //这里的判断,是不是存在隐含的问题呢。 }

登入後複製

如何严谨一些呢。

if(window['cusVar']) { //保证它不报错。
  //或者这样的判断也是可行的 window.cusVar | typeof cusVar !== 'undefined'
  //干活咯
}

登入後複製

最后补充又一个小quiz, (理解 预解析与执行的分离)

var y7 = 'test';
function fun1(){
  alert(y7);
  var y7 = 'sex';
}
fun1();

登入後複製

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结

希望本文所述对大家JavaScript程序设计有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles