JavaScript預解析及相關技巧分析_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程序设计有所帮助。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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