成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js幾個經(jīng)典的題目詳解

stormgens / 3388人閱讀

摘要:四這個題目比較簡單即函數(shù)聲明和變量聲明的關(guān)系和影響,遇到同名的函數(shù)聲明,不會重新定義五關(guān)于這個題目,的規(guī)范有解釋的。屬性的值是對象關(guān)于對象的具體定義,看這里對象六這個題目可以說是最簡單的,也是最詭異的關(guān)于這個題目,我們先來了解個概念。

廢話不多說,直接看題目,先不要急著看答案 先自己思考,收獲更多

(長期補倉);

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

代碼解析:這道題的考點分兩個 
1.作用域
2.運算符(賦值預(yù)算,逗號運算)

先看第一個輸出:25,因為(inner.func, inner.func)是進(jìn)行逗號運算符,逗號運算符就是 運算前面的,
返回最后一個,舉個栗子

var i=0,j=1,k=2;
console.log((i++,j++,k))//返回的是k的值 2 ,如果寫成k++的話  這里返回的就是 3
console.log(i);//1
console.log(j);//2
console.log(k);//2   

回到原題(inner.func, inner.func)就是返回inner.func而inner.func只是一個匿名函數(shù) 
function () {
    var out = 30;
    return this.out;
}
而且這個匿名函數(shù)是屬于window的
則變成了
(function () {
    var out = 30;
    return this.out;
})()
此刻的this--》window

所以out 是25

第二和第三個console.log的作用域都是 foo,也就是他們執(zhí)行的其實是
foo.func();
foo作用域中是有out變量的,所以結(jié)果是20

第四個console.log
考查的是一個等號運算inner.func = inner.func 其實返回的是運算的結(jié)果,
舉個栗子
var a=2,b=3;
console.log(a=b)//輸出的是3
所以inner.func = inner.func 返回的也是一個匿名函數(shù)
function () {
    var out = 30;
    return this.out;
}

此刻 道理就和第一個console.log一樣了 輸出的結(jié)果是 25
if (!("a" in window)) {
    var a = 1;
}
alert(a);





代碼解析:如果window不包含屬性a,就聲明一個變量a,然后賦值為1。

你可能認(rèn)為alert出來的結(jié)果是1,然后實際結(jié)果是“undefined”。要了解為什么,
需要知道JavaScript里的3個概念。

首先,所有的全局變量都是window的屬性,語句 var a = 1;等價于window.a = 1;

你可以用如下方式來檢測全局變量是否聲明:"變量名稱" in window
第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子:   

alert("b" in window);
var b;

此時,盡管聲明是在alert之后,alert彈出的依然是true,這是因為JavaScript引擎
首先會掃墓所有的變量聲明,然后將這些變量聲明移動到頂部,最終的代碼效果是這樣的:

var a;
alert("a" in window);
這樣看起來就很容易解釋為什么alert結(jié)果是true了。

第三,你需要理解該題目的意思是,變量聲明被提前了,
但變量賦值沒有,因為這行代碼包括了變量聲明和變量賦值。

你可以將語句拆分為如下代碼:

var a;    //聲明
a = 1;    //初始化賦值
當(dāng)變量聲明和賦值在一起用的時候,JavaScript引擎會自動將它分為兩部以便將變量聲明提前,
不將賦值的步驟提前是因為他有可能影響    代碼執(zhí)行出不可預(yù)期的結(jié)果。

所以,知道了這些概念以后,重新回頭看一下題目的代碼,其實就等價于:

var a;
if (!("a" in window)) {
    a = 1;
}
alert(a);
這樣,題目的意思就非常清楚了:首先聲明a,然后判斷a是否在存在,如果不存在就賦值為1,
很明顯a永遠(yuǎn)在window里存在,這個賦值語    句永遠(yuǎn)不會執(zhí)行,所以結(jié)果是undefined。

提前這個詞語顯得有點迷惑了,你可以理解為:預(yù)編譯。
   var a = 1;

   var b = function a(x) {
            x && a(--x);
        };
 
   alert(a);

這個題目看起來比實際復(fù)雜,alert的結(jié)果是1;這里依然有3個重要的概念需要我們知道。

首先,在題目1里我們知道了變量聲明在進(jìn)入執(zhí)行上下文就完成了;第二個概念就是函數(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ù)聲明會覆蓋變量聲明,但不會覆蓋變量賦值,為了解釋這個,我們來看一個例子:

function value(){
    return 1;
}
var value;
alert(typeof value);    //"function"
盡快變量聲明在下面定義,但是變量value依然是function,也就是說這種情況下,
函數(shù)聲明的優(yōu)先級高于變量聲明的優(yōu)先級,但如果該    變量value賦值了,那結(jié)果就完全不一樣了:

function value(){
    return 1;
}
var value = 1;
alert(typeof value);    //"number"
該value賦值以后,變量賦值初始化就覆蓋了函數(shù)聲明。

重新回到題目,這個函數(shù)其實是一個有名函數(shù)表達(dá)式,函數(shù)表達(dá)式不像函數(shù)聲明一樣可以覆蓋變量聲明,
但你可以注意到,變量b是包含了該函數(shù)表達(dá)式,而該函數(shù)表達(dá)式的名字是a;不同的瀏覽器對a這個名
詞處理有點不一樣,在IE里,會將a認(rèn)為函數(shù)聲明,所以它被變量初始    化覆蓋了,就是說如果調(diào)用a(–x)的
話就會出錯,而其它瀏覽器在允許在函數(shù)內(nèi)部調(diào)用a(–x),因為這時候a在函數(shù)外面依然是數(shù)字。
基本上,IE里調(diào)用b(2)的時候會出錯,但其它瀏覽器則返回undefined。

理解上述內(nèi)容之后,該題目換成一個更準(zhǔn)確和更容易理解的代碼應(yīng)該像這樣:

var a = 1,
    b = function(x) {
    x && b(--x);
    };
alert(a);
這樣的話,就很清晰地知道為什么alert的總是1了。
function a(x) {
    return x * 2;
}
var a;
alert(a);
這個題目比較簡單:即函數(shù)聲明和變量聲明的關(guān)系和影響,遇到同名的函數(shù)聲明,不會重新定義

4、function b(x, y, a) {
        arguments[2] = 10;
        alert(a);
    }
    b(1, 2, 3);
關(guān)于這個題目,ECMAsCRIPT 262-3的規(guī)范有解釋的。

活動對象是在進(jìn)入函數(shù)上下文時刻被創(chuàng)建的,它通過函數(shù)的arguments屬性初始化。
arguments屬性的值是Arguments對象.
關(guān)于 Arguments對象的具體定義,看這里:ECMAScript arguments 對象
    function a() {
        alert(this);
    }
    a.call(null);
 
這個題目可以說是最簡單的,也是最詭異的!關(guān)于這個題目,我們先來了解2個概念。

這個問題主要考察 Javascript 的 this 關(guān)鍵字,具體看這里:

關(guān)于Javascript語言中this關(guān)鍵字的用法

關(guān)于 a.call(null);  根據(jù)ECMAScript262規(guī)范規(guī)定:如果第一個參數(shù)傳入的對象調(diào)用者是null
或者undefined的話,call方法將把全局對象(也就是window)作為this的值。所以,
不管你什么時候傳入null,其this都是全局對象window,所以該題目可以理解成如下代碼:
function a() {
    alert(this);
}
a.call(window);
所以彈出的結(jié)果是[object Window]就很容易理解了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86069.html

相關(guān)文章

  • Java經(jīng)典

    摘要:請注意,我們在聊聊單元測試遇到問題多思考多查閱多驗證,方能有所得,再勤快點樂于分享,才能寫出好文章。單元測試是指對軟件中的最小可測試單元進(jìn)行檢查和驗證。 JAVA容器-自問自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們在工作中經(jīng)常會使用,而且面試中也很頻繁會問到,因為它里面蘊含著很多知識點,可以很好的考察個人基礎(chǔ)。但一個這么重要的東西,我為什么沒有在一開始...

    xcold 評論0 收藏0
  • 個人分享--web前端學(xué)習(xí)資源分享

    摘要:前言月份開始出沒社區(qū),現(xiàn)在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議那么今天我就把看過的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區(qū),現(xiàn)在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議!那么今天我就...

    sherlock221 評論0 收藏0
  • 【周刊-2】三年大廠面試官-前端面試題(偏難)

    摘要:前言在大廠工作了年,當(dāng)了年的前端面試官,把大廠常問的面試題與答案匯總在我的中。第題如何劫持的請求,提供思路難度阿里騰訊很多人在上搜索前端面試詳解,把答案倒背如流,但是問到如何劫持請求的時候就一臉懵逼,是因為還是停留在理論性階段。前言 在大廠工作了6年,當(dāng)了3年的前端面試官,把大廠常問的面試題與答案匯總在我的Github中。希望對大家有所幫助,助力大家進(jìn)入自己理想的企業(yè)。 項目地址是:git...

    silvertheo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<