js中的预解释
在js中,帶var 和function關(guān)鍵字的需要預(yù)解釋:
那什么是預(yù)解釋?就是在js代碼執(zhí)行之前,先申明好帶有var 關(guān)鍵字和帶有function關(guān)鍵字的變量,在內(nèi)存里先安排好。但是帶有var關(guān)鍵字的和帶有function關(guān)鍵字的預(yù)解釋是有區(qū)別的:
1.帶有function關(guān)鍵字的,在整個(gè)js腳本執(zhí)行之前,就已經(jīng)把函數(shù)名在內(nèi)存里安排好了,并且給這個(gè)函數(shù)名賦值了,就是把函數(shù)體也賦值給了函數(shù)名;
例如:fn1();
function fn1(){alert('this is fn1')};
當(dāng)你在調(diào)用的fn1的時(shí)候,fn1已經(jīng)申明并且賦值了,哪里都可以調(diào)用;
2.帶有var關(guān)鍵字的,在js申明的時(shí)候只是申明有這個(gè)變量了,不給賦值,在預(yù)解釋完成之后運(yùn)行js代碼的時(shí)候才給賦值;
例如:
console.log(a)//undefined
var a='123';
console.log(a)//123
在預(yù)解釋的時(shí)候只是申明了這個(gè)變量a,沒(méi)有給a賦值,所以第一個(gè)打印出來(lái)的是undefined
第二次打印的時(shí)候,a已被賦值,所以他的結(jié)果是123;
下面是一道面試題:
var m=0;
var n=1;
function fn(){
??? alert(n);
??? alert(m);
??? n=4;
?? var? n=5;
?? alert(n)
}
fn();
請(qǐng)問(wèn)輸出結(jié)果是什么?
這個(gè)面試題主要考的就是作用域和預(yù)解釋。
首先預(yù)解釋m,n,fn;
接著執(zhí)行代碼:給m賦值0,給n賦值1,執(zhí)行函數(shù)fn;
執(zhí)行函數(shù)fn的時(shí)候,在fn這個(gè)作用域里還要一次預(yù)解釋:
首先申明變量n;
接著執(zhí)行函數(shù)體里面的語(yǔ)句:
alert(n),這個(gè)n是哪里的n?首先要在當(dāng)前作用域里面找這個(gè)n,由于上一步在這個(gè)函數(shù)作用域內(nèi)已經(jīng)申明了這個(gè)n,n此時(shí)還是未定義,所以此時(shí)輸出的是undefined;
接著alert(m),這里的m是哪個(gè)m?首先還是在當(dāng)前的作用域里面找,沒(méi)有找到,繼續(xù)往上一級(jí)作用域(window)找,結(jié)果在上一級(jí)作用域里面找到了m,這個(gè)已經(jīng)是被賦值了,所以輸出為1;
接著n=7,這個(gè)n被賦值了4,代碼繼續(xù)執(zhí)行,n又被賦值為5,
接著又有個(gè)alert(n),此時(shí)的n就是這個(gè)函數(shù)的私有作用域里面的n,而且被賦值為6.所以alert(n)是6.。。。。+
轉(zhuǎn)載于:https://www.cnblogs.com/-youth/p/5554857.html
總結(jié)
- 上一篇: 自定义分页(模块化)
- 下一篇: 第十四周学习进度