摘要:四這個(gè)題目比較簡(jiǎn)單即函數(shù)聲明和變量聲明的關(guān)系和影響,遇到同名的函數(shù)聲明,不會(huì)重新定義五關(guān)于這個(gè)題目,的規(guī)范有解釋的。屬性的值是對(duì)象關(guān)于對(duì)象的具體定義,看這里對(duì)象六這個(gè)題目可以說(shuō)是最簡(jiǎn)單的,也是最詭異的關(guān)于這個(gè)題目,我們先來(lái)了解個(gè)概念。
廢話(huà)不多說(shuō),直接看題目,先不要急著看答案 先自己思考,收獲更多
(長(zhǎng)期補(bǔ)倉(cāng));
一var out = 25, inner = { out: 20, func: function () { var out = 30; return this.out; } }; console.log((inner.func, inner.func)()); console.log(inner.func()); console.log((inner.func)()); console.log((inner.func = inner.func)());
25,20,20,25 代碼解析:這道題的考點(diǎn)分兩個(gè) 1.作用域 2.運(yùn)算符(賦值預(yù)算,逗號(hào)運(yùn)算) 先看第一個(gè)輸出:25,因?yàn)?inner.func, inner.func)是進(jìn)行逗號(hào)運(yùn)算符,逗號(hào)運(yùn)算符就是 運(yùn)算前面的, 返回最后一個(gè),舉個(gè)栗子 var i=0,j=1,k=2; console.log((i++,j++,k))//返回的是k的值 2 ,如果寫(xiě)成k++的話(huà) 這里返回的就是 3 console.log(i);//1 console.log(j);//2 console.log(k);//2 回到原題(inner.func, inner.func)就是返回inner.func而inner.func只是一個(gè)匿名函數(shù) function () { var out = 30; return this.out; } 而且這個(gè)匿名函數(shù)是屬于window的 則變成了 (function () { var out = 30; return this.out; })() 此刻的this--》window 所以out 是25 第二和第三個(gè)console.log的作用域都是 foo,也就是他們執(zhí)行的其實(shí)是 foo.func(); foo作用域中是有out變量的,所以結(jié)果是20 第四個(gè)console.log 考查的是一個(gè)等號(hào)運(yùn)算inner.func = inner.func 其實(shí)返回的是運(yùn)算的結(jié)果, 舉個(gè)栗子 var a=2,b=3; console.log(a=b)//輸出的是3 所以inner.func = inner.func 返回的也是一個(gè)匿名函數(shù) function () { var out = 30; return this.out; } 此刻 道理就和第一個(gè)console.log一樣了 輸出的結(jié)果是 25二
if (!("a" in window)) { var a = 1; } alert(a);
代碼解析:如果window不包含屬性a,就聲明一個(gè)變量a,然后賦值為1。 你可能認(rèn)為alert出來(lái)的結(jié)果是1,然后實(shí)際結(jié)果是“undefined”。要了解為什么, 需要知道JavaScript里的3個(gè)概念。 首先,所有的全局變量都是window的屬性,語(yǔ)句 var a = 1;等價(jià)于window.a = 1; 你可以用如下方式來(lái)檢測(cè)全局變量是否聲明:"變量名稱(chēng)" in window 第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子: alert("b" in window); var b; 此時(shí),盡管聲明是在alert之后,alert彈出的依然是true,這是因?yàn)镴avaScript引擎 首先會(huì)掃墓所有的變量聲明,然后將這些變量聲明移動(dòng)到頂部,最終的代碼效果是這樣的: var a; alert("a" in window); 這樣看起來(lái)就很容易解釋為什么alert結(jié)果是true了。 第三,你需要理解該題目的意思是,變量聲明被提前了, 但變量賦值沒(méi)有,因?yàn)檫@行代碼包括了變量聲明和變量賦值。 你可以將語(yǔ)句拆分為如下代碼: var a; //聲明 a = 1; //初始化賦值 當(dāng)變量聲明和賦值在一起用的時(shí)候,JavaScript引擎會(huì)自動(dòng)將它分為兩部以便將變量聲明提前, 不將賦值的步驟提前是因?yàn)樗锌赡苡绊? 代碼執(zhí)行出不可預(yù)期的結(jié)果。 所以,知道了這些概念以后,重新回頭看一下題目的代碼,其實(shí)就等價(jià)于: var a; if (!("a" in window)) { a = 1; } alert(a); 這樣,題目的意思就非常清楚了:首先聲明a,然后判斷a是否在存在,如果不存在就賦值為1, 很明顯a永遠(yuǎn)在window里存在,這個(gè)賦值語(yǔ) 句永遠(yuǎn)不會(huì)執(zhí)行,所以結(jié)果是undefined。 提前這個(gè)詞語(yǔ)顯得有點(diǎn)迷惑了,你可以理解為:預(yù)編譯。三
var a = 1; var b = function a(x) { x && a(--x); }; alert(a);
這個(gè)題目看起來(lái)比實(shí)際復(fù)雜,alert的結(jié)果是1;這里依然有3個(gè)重要的概念需要我們知道。 首先,在題目1里我們知道了變量聲明在進(jìn)入執(zhí)行上下文就完成了;第二個(gè)概念就是函數(shù)聲明也是提前的, 所有的函數(shù)聲明都在執(zhí)行代碼之前都已經(jīng)完成了聲明,和變 量聲明一樣。澄清一下,函數(shù)聲明是如下這樣的代碼: function functionName(arg1, arg2){ //函數(shù)體 } 如下不是函數(shù),而是函數(shù)表達(dá)式,相當(dāng)于變量賦值: var functionName = function(arg1, arg2){ //函數(shù)體 }; 澄清一下,函數(shù)表達(dá)式?jīng)]有提前,就相當(dāng)于平時(shí)的變量賦值。 第三需要知道的是,函數(shù)聲明會(huì)覆蓋變量聲明,但不會(huì)覆蓋變量賦值,為了解釋這個(gè),我們來(lái)看一個(gè)例子: function value(){ return 1; } var value; alert(typeof value); //"function" 盡快變量聲明在下面定義,但是變量value依然是function,也就是說(shuō)這種情況下, 函數(shù)聲明的優(yōu)先級(jí)高于變量聲明的優(yōu)先級(jí),但如果該 變量value賦值了,那結(jié)果就完全不一樣了: function value(){ return 1; } var value = 1; alert(typeof value); //"number" 該value賦值以后,變量賦值初始化就覆蓋了函數(shù)聲明。 重新回到題目,這個(gè)函數(shù)其實(shí)是一個(gè)有名函數(shù)表達(dá)式,函數(shù)表達(dá)式不像函數(shù)聲明一樣可以覆蓋變量聲明, 但你可以注意到,變量b是包含了該函數(shù)表達(dá)式,而該函數(shù)表達(dá)式的名字是a;不同的瀏覽器對(duì)a這個(gè)名 詞處理有點(diǎn)不一樣,在IE里,會(huì)將a認(rèn)為函數(shù)聲明,所以它被變量初始 化覆蓋了,就是說(shuō)如果調(diào)用a(–x)的 話(huà)就會(huì)出錯(cuò),而其它瀏覽器在允許在函數(shù)內(nèi)部調(diào)用a(–x),因?yàn)檫@時(shí)候a在函數(shù)外面依然是數(shù)字。 基本上,IE里調(diào)用b(2)的時(shí)候會(huì)出錯(cuò),但其它瀏覽器則返回undefined。 理解上述內(nèi)容之后,該題目換成一個(gè)更準(zhǔn)確和更容易理解的代碼應(yīng)該像這樣: var a = 1, b = function(x) { x && b(--x); }; alert(a); 這樣的話(huà),就很清晰地知道為什么alert的總是1了。四
function a(x) { return x * 2; } var a; alert(a);
這個(gè)題目比較簡(jiǎn)單:即函數(shù)聲明和變量聲明的關(guān)系和影響,遇到同名的函數(shù)聲明,不會(huì)重新定義五
4、function b(x, y, a) { arguments[2] = 10; alert(a); } b(1, 2, 3);
關(guān)于這個(gè)題目,ECMAsCRIPT 262-3的規(guī)范有解釋的。 活動(dòng)對(duì)象是在進(jìn)入函數(shù)上下文時(shí)刻被創(chuàng)建的,它通過(guò)函數(shù)的arguments屬性初始化。 arguments屬性的值是Arguments對(duì)象. 關(guān)于 Arguments對(duì)象的具體定義,看這里:ECMAScript arguments 對(duì)象六
function a() { alert(this); } a.call(null);
這個(gè)題目可以說(shuō)是最簡(jiǎn)單的,也是最詭異的!關(guān)于這個(gè)題目,我們先來(lái)了解2個(gè)概念。 這個(gè)問(wèn)題主要考察 Javascript 的 this 關(guān)鍵字,具體看這里: 關(guān)于Javascript語(yǔ)言中this關(guān)鍵字的用法 關(guān)于 a.call(null); 根據(jù)ECMAScript262規(guī)范規(guī)定:如果第一個(gè)參數(shù)傳入的對(duì)象調(diào)用者是null 或者undefined的話(huà),call方法將把全局對(duì)象(也就是window)作為this的值。所以, 不管你什么時(shí)候傳入null,其this都是全局對(duì)象window,所以該題目可以理解成如下代碼: function a() { alert(this); } a.call(window); 所以彈出的結(jié)果是[object Window]就很容易理解了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86069.html
摘要:請(qǐng)注意,我們?cè)诹牧膯卧獪y(cè)試遇到問(wèn)題多思考多查閱多驗(yàn)證,方能有所得,再勤快點(diǎn)樂(lè)于分享,才能寫(xiě)出好文章。單元測(cè)試是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。 JAVA容器-自問(wèn)自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用,而且面試中也很頻繁會(huì)問(wèn)到,因?yàn)樗锩嫣N(yùn)含著很多知識(shí)點(diǎn),可以很好的考察個(gè)人基礎(chǔ)。但一個(gè)這么重要的東西,我為什么沒(méi)有在一開(kāi)始...
摘要:前言月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議那么今天我就把看過(guò)的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多9月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議!那么今天我就...
摘要:前言在大廠工作了年,當(dāng)了年的前端面試官,把大廠常問(wèn)的面試題與答案匯總在我的中。第題如何劫持的請(qǐng)求,提供思路難度阿里騰訊很多人在上搜索前端面試詳解,把答案倒背如流,但是問(wèn)到如何劫持請(qǐng)求的時(shí)候就一臉懵逼,是因?yàn)檫€是停留在理論性階段。前言 在大廠工作了6年,當(dāng)了3年的前端面試官,把大廠常問(wèn)的面試題與答案匯總在我的Github中。希望對(duì)大家有所幫助,助力大家進(jìn)入自己理想的企業(yè)。 項(xiàng)目地址是:git...
閱讀 2982·2021-11-24 09:39
閱讀 1266·2021-11-02 14:38
閱讀 4313·2021-09-10 11:26
閱讀 2852·2021-08-25 09:40
閱讀 2386·2019-08-30 15:54
閱讀 557·2019-08-30 10:56
閱讀 2864·2019-08-26 12:14
閱讀 3299·2019-08-26 12:13