欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript預解析及相關技巧分析

 更新時間:2016年04月21日 10:15:30   作者:zhangw428  
這篇文章主要介紹了JavaScript預解析及相關技巧,結合實例形式分析了JavaScript與解析的原理,步驟與相關技巧,需要的朋友可以參考下

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

變量

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

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

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

javascript在執(zhí)行過程之前,會做一件事件“預解析”。解析引擎會以塊為單位級別,執(zhí)行所有 var 變量的創(chuàng)建,并賜予它們一個初始值:undefined。這樣一來,第一個例子為什么會彈出undefined的原因就顯而易見了。

所以第一段代碼其實就等價于

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

那第二段代碼為什么又拋錯呢,此時就不再屬于“預解析”階段了,(在這里我假設瀏覽器遇到一個script標簽時只做兩件事:預解析和執(zhí)行,其實不 只這兩件事情),而處于執(zhí)行階段,拋錯原因在于js在執(zhí)行段狀態(tài)并不知曉y2的狀態(tài)(預解析階段沒有捕獲到y(tǒng)2的任何信息),當然就拋出未定義的錯誤信 息。這里又牽扯到另一個問題: js 是弱類型語言,變量不定義可以用,那為什么這里又拋出為定義錯誤呢。

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

y2 = 'exam';  
//在沒出現它的定義操作之前(即在它還沒有自己的scope之前)該操作會將這段代碼認為是定義一個全局變量,在window上注冊一個屬性y2,并賦值為exam

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

再注:這里需要區(qū)分, 變量的讀寫不均等 僅用于變量,讀取所有對象的屬性,不存在該特性,如果不存在,會提示undefined。

結論

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

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執(zhí)行,動態(tài)修改的結果,依然遵循了變量的預解析規(guī)則(在上面alert的時候,它還并沒有拿到字面量函數的信息)。
如果是兩個混合呢??聪旅? 同時存在了為y4的變量和function。

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

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

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

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

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

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

如何更好的做參數判斷

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

eg:

if(cusVar){ //這里的判斷,是不是存在隱含的問題呢。 }

如何嚴謹一些呢。

if(window['cusVar']) { //保證它不報錯。
  //或者這樣的判斷也是可行的 window.cusVar | typeof cusVar !== 'undefined'
  //干活咯
}

最后補充又一個小quiz, (理解 預解析與執(zhí)行的分離)

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • JavaScript中string對象

    JavaScript中string對象

    和JAVA中String對象用處一樣啊,javascript中的String對象也有自己的方法,和JAVA中的類似。
    2015-06-06
  • 一文搞懂如何避免JavaScript內存泄漏

    一文搞懂如何避免JavaScript內存泄漏

    SPA的興起,促使我們更加關注與內存相關的JavaScript編碼實踐。如果應用使用的內存越來越多,就會嚴重影響性能,甚至導致瀏覽器的崩潰。下面就來看看JavaScript中常見的內存泄漏以及如何避免內存泄漏
    2022-05-05
  • JavaScript QueryString解析類代碼

    JavaScript QueryString解析類代碼

    以前寫的一個解析QueryString的JS類,可以獲取或設置QueryString中的值,記下了方便找 :)
    2010-01-01
  • JavaScript實現在標題欄上顯示當前日期的方法

    JavaScript實現在標題欄上顯示當前日期的方法

    這篇文章主要介紹了JavaScript實現在標題欄上顯示當前日期的方法,涉及javascript操作時間及DOM節(jié)點的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • js實現tab欄切換效果

    js實現tab欄切換效果

    這篇文章主要為大家詳細介紹了js實現tab欄切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript常見事件對象與操作實例總結

    JavaScript常見事件對象與操作實例總結

    這篇文章主要介紹了JavaScript常見事件對象與操作,結合實例形式總結分析了javascript針對DOM、IE及跨瀏覽器事件對象的相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • js讀取json的兩種常用方法示例介紹

    js讀取json的兩種常用方法示例介紹

    js讀取json的方法或許很多,但常用的就那兩種,本文以示例代碼的方式為大家介紹下其具體的實現
    2014-10-10
  • JS 組件系列之Bootstrap Table的凍結列功能徹底解決高度問題

    JS 組件系列之Bootstrap Table的凍結列功能徹底解決高度問題

    這篇文章主要介紹了JS 組件系列之Bootstrap Table的凍結列功能徹底解決高度問題,需要的朋友可以參考下
    2017-06-06
  • Bootstrap的class樣式小結

    Bootstrap的class樣式小結

    本文給大家總結了bootstrap的class樣式,由基礎到內涵給大家介紹的非常詳細,需要的的朋友可以參考下
    2016-12-12
  • IScroll那些事_當內容不足時下拉刷新的解決方法

    IScroll那些事_當內容不足時下拉刷新的解決方法

    下面小編就為大家?guī)硪黄狪Scroll那些事_當內容不足時下拉刷新的解決方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論