通過(guò)示例演示理解javascript預(yù)解析
面試官最愛(ài)考的javascript預(yù)解析,你搞明白了嗎?javascript的es5語(yǔ)法和其他語(yǔ)言還是有些區(qū)別的,預(yù)解析正是面試愛(ài)考的重點(diǎn),不妨來(lái)看看這篇博文…
提出問(wèn)題
先看下面的兩個(gè)最基本問(wèn)題,結(jié)果你想到了嗎?
坑一
<script> // 坑一 console.log(num); var num = 10; </script>
結(jié)果為什么會(huì)是undefined呢?先保留這個(gè)疑問(wèn),后面解答,嘿嘿嘿~~~
坑二
下面這種函數(shù)定義方式,函數(shù)的調(diào)用在函數(shù)前后都可以
// 下面這種函數(shù)定義方式,函數(shù)的調(diào)用在函數(shù)前后都可以 fn(); function fn(){ console.log(15); } //fn();
那么我們?cè)倏纯磈avascript中的另一種函數(shù)定義(函數(shù)表達(dá)式)是否和上面的一樣呢?
// 下面這種函數(shù)定義方式,函數(shù)的調(diào)用只能在函數(shù)后面 fun(); var fun = function(){ console.log(15); } // fun();
這種函數(shù)定義,函數(shù)的調(diào)用放在函數(shù)前面為什么又會(huì)報(bào)錯(cuò)了呢,帶著疑問(wèn)我們看下面的解答。
問(wèn)題解答
要了解上面兩個(gè)坑的原因,我們就要知道javascript中的預(yù)解析。
1.我們 js 引擎運(yùn)行 js 分為兩步:預(yù)解析和代碼執(zhí)行。
- (1).預(yù)解析 :js 引擎會(huì)把 js 里面所有的 var 還有 function 提升到當(dāng)前作用域的最前面
- (2).代碼執(zhí)行:按照代碼書(shū)寫(xiě)的順序從上往下執(zhí)行。
2.預(yù)解析分為變量預(yù)解析(變量提升)和函數(shù)預(yù)解析(函數(shù)提升)。
- (1).變量提升就是把所有的變量聲明提升到當(dāng)前的作用域最前面,不提升賦值操作。
- (2).函數(shù)提升就是把所有的函數(shù)聲明提升到當(dāng)前作用于的最前面。
看了上述,是不是對(duì)于上面的疑惑解決了,還是懵懵懂懂嗎?下面我來(lái)復(fù)現(xiàn)一下你就明白了。
// // 坑一 // console.log(num); // var num = 10; // 相當(dāng)于執(zhí)行了以下代碼 var num; // 所有的 var 提升到當(dāng)前作用域的最前面,不提升賦值操作。 console.log(num); //num此時(shí)未賦值,所以是undefined。 num = 10;
// // 坑二 // 下面這種函數(shù)定義方式,函數(shù)的調(diào)用在函數(shù)前后都可以 // fn(); // function fn(){ // console.log(15); // } // 相當(dāng)于執(zhí)行下面代碼 // 函數(shù)提升到當(dāng)前作用域的最前面 function fn(){ console.log(15); } fun(); // 下面這種函數(shù)定義方式,函數(shù)的調(diào)用只能在函數(shù)后面 // fun(); // var fun = function(){ // console.log(15); // } // 相當(dāng)于執(zhí)行了以下代碼 var fun; // 所有的 var 提升到當(dāng)前作用域的最前面,不提升賦值操作。 fun(); // 此時(shí)壓根沒(méi)有fun()這個(gè)函數(shù),所以會(huì)報(bào)錯(cuò) fun = function(){ console.log(15); }
現(xiàn)在是不是很清楚了。
案例練習(xí)
案例一
結(jié)果是幾?
// 案例一 var num=10; fun(); function fun(){ console.log(num); var num = 20; } // 相當(dāng)于執(zhí)行了以下代碼 // var num; // function fun(){ // var num; // console.log(num); //根據(jù)作用域鏈的就近原則,此時(shí)num未賦值,所以是undefined // num = 20; // } // num = 10; // fun(); // 調(diào)用函數(shù)
案例二
結(jié)果是幾?
// 案例二 var num = 10; function fn(){ console.log(num); var num = 20; console.log(num); } fn(); // 相當(dāng)于執(zhí)行了以下代碼 // var num; // function fn(){ // var num; // console.log(num); //根據(jù)作用域鏈就近原則,此時(shí)num未賦值,所以是undefined // num = 20; // console.log(num); // 根據(jù)作用域鏈就近原則,num是20 // } // num = 10; // fn(); // 調(diào)用函數(shù)
案例三
結(jié)果是幾?
// 案例三 var a = 18; f1(); function f1(){ var b = 9; console.log(a); console.log(b); var a = '123'; } // // 相當(dāng)于執(zhí)行了以下代碼 // var a; // function f1() { // var b; // var a; // b = 9; // console.log(a); //根據(jù)作用域鏈就近原則,此時(shí)a未賦值,所以是undefined // console.log(b); // 9 // a = '123'; // } // a = 18; // f1();
案例四(經(jīng)典的面試題)
結(jié)果是幾?
// 案例四 f1(); console.log(c); console.log(b); console.log(a); function f1(){ var a = b = c = 9; // 相當(dāng)于var a = 9; b = 9 ; c = 9 ; 在javascript中不用var申明直接賦值的變量是全局變量,所以b,c是全局變量 // 區(qū)別于集體聲明 var a = 9,b = 9,c = 9; 等價(jià)于var a = 9,var b = 9,var c = 9; console.log(a); console.log(b); console.log(c); } // // 相當(dāng)于執(zhí)行了以下代碼 // function f1(){ // var a; // b = 9; // c = 9; // a = 9; // console.log(a); // 9 // console.log(b); // 9 // console.log(c); // 9 // } // f1(); // 函數(shù)調(diào)用 // console.log(c); // 9 // console.log(b); // 9 // console.log(a); // a是函數(shù)里的局部變量,所以函數(shù)外沒(méi)有申明的話會(huì)報(bào)錯(cuò)
結(jié)語(yǔ)
看了這節(jié)內(nèi)容,你掌握javascript中的預(yù)解析了嗎,面試再也不怕啦!?。?/p>
相關(guān)文章
淺談JavaScript中面向?qū)ο蟮牡纳羁截惡蜏\拷貝
下面小編就為大家?guī)?lái)一篇淺談JavaScript中面向?qū)ο蟮牡纳羁截惡蜏\拷貝。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符用法實(shí)例分析
這篇文章主要介紹了ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符用法,結(jié)合實(shí)例形式分析了ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符基本功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05微信小程序 扭蛋抽獎(jiǎng)機(jī)css3動(dòng)畫(huà)實(shí)現(xiàn)詳解
這篇文章主要介紹了微信小程序 扭蛋抽獎(jiǎng)機(jī)css3動(dòng)畫(huà)實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07通過(guò)函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈
這篇文章給大家分享了通過(guò)函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。2018-08-08