在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ JavaScript 關(guān)于面試題

JavaScript 關(guān)于面試題

請寫出彈出值,并解釋為什么。

~function () {
    alert(a);
    a();
    var a = function () {
        console.log(1);
    }

    function a() {
        console.log(2);
    }

    alert(a)
    a();
    var c = d = a;
}();

alert(d); 
alert(c); 
回答
編輯回答
賤人曾

1: function a() {

console.log(2);

}

2,3 var a = function () {

console.log(1);

}

4: 報錯
因為 函數(shù)提升優(yōu)于變量提升 且 變量提升只聲明不賦值, 局部變量作用于局部

2018年7月12日 01:51
編輯回答
久舊酒

詞法分析:
0:函數(shù)的在運行的瞬間,生成一個活動對象(Active Object)就是所謂的AO

1:分析參數(shù)

  1-1:函數(shù)接收參數(shù),添加到AO的屬性上面,值全部都是undefine,如AO.age=undefine

  1-2:接收實參,形成AO對應(yīng)的屬性值

2:分析變量聲明,如var age,

 2-1:如果AO上還沒有age屬性,則添加AO 屬性,值是undefine

 2-2:如果AO 上面已經(jīng)有了age屬性,則不做任何操作。

3:分析函數(shù)的聲明,例如funcion a(){},

3-1: 則把函數(shù)賦給AO.a,如果數(shù)據(jù)屬性已經(jīng)存在,則要被現(xiàn)在的新的值覆蓋
4:執(zhí)行 (賦值操作是執(zhí)行中的過程);

放在這道題里就是:

分析參數(shù):
即時函數(shù)沒有參數(shù);
分析變量:
函數(shù)內(nèi)部 AO= {a:undifined,c:undefined} 全局 AO= {c:undefined}

分析函數(shù)的聲明:
function a() {console.log(2);}
因為AO中已經(jīng)存在a,a被覆蓋為function a() {console.log(2);}
執(zhí)行:
alert(a);//a就是函數(shù)聲明 function a() {console.log(2);}
a();//執(zhí)行a -->2
var a = function () {console.log(1);} a被賦值為新函數(shù)
function a() {console.log(2);} //已經(jīng)分析過跳過
alert(a) // 彈出a 為新賦值的 function () {console.log(1);}
a(); 執(zhí)行a 打印 1
var c = d = a; // c d 賦值為function () {console.log(1);}

即時函數(shù)執(zhí)行完,向下執(zhí)行

alert(d); //作用域中有d 為function () {console.log(1);}
alert(c); //作用域中沒有c 報錯c is not defined

2017年8月27日 20:15
編輯回答
懶洋洋

中間那段代碼等同于如下

function a() {

console.log(2);

}
var a;

alert(a);
a();

a = function () {

console.log(1);

}

alert(a)
a();
var c = d = a;
首先了解變量提升和函數(shù)聲明提升

function a() {

console.log(2);

}是函數(shù)聲明,會提升到代碼頂部
從上到下依次順序:
1.彈出
function a() {

console.log(2);

}
2.后臺打印出:
2
3:彈出
function () {

console.log(1);

}
4.后臺打印出
1
5,6.都彈出
function () {

console.log(1);

}

2018年9月1日 04:23
編輯回答
莫小染

主要考點就是函數(shù)和變量聲明的提升順序

~function () {

    alert(a) //function a(){ //coding }
    a();//console.log(2)

    var a = function () {
        console.log(1);
    }

    function a() {
        console.log(2);
    }

    alert(a)//a = function () { //coding }
    a();//console.log(1)
    var c = d = a;
}();
alert(d);//a = function () { //coding } d為全局變量
alert(c) //ReferenceError: c is not defined c是局部變量
2017年3月7日 11:57
編輯回答
遺莣

你的代碼最好用代碼標(biāo)記工具專門標(biāo)記出來啊。

出這個問題的人是比較BT的。

2017年7月5日 22:32
編輯回答
使勁操

關(guān)于這段代碼,我關(guān)注兩個問題:
1、alert 出什么?
2、對于

~function () {

    function code
    
    }();

這段語句為何能作為函數(shù)執(zhí)行起來?
問題一的話,上面幾位朋友說得很清楚,關(guān)于問題二就是通過 ~ ! || 等操作符使得解釋器將函數(shù)聲明能當(dāng)做表達(dá)式來處理。
詳見這里描述得很詳細(xì)

2017年4月24日 20:25
編輯回答
遺莣

包括打印和alert的值如下:
1、

function a() {
   console.log(2);
}

2、2
3、

function a() {
   console.log(1);
}

4、1
5、

function a() {
   console.log(1);
}

原因: var c = d = a;從右向左執(zhí)行,d=a,d沒有使用var聲明,是一個全局變量,方法外部可訪問。
6、報錯,原因:c是函數(shù)內(nèi)部的變量,外部訪問不到的,外部變量c是undefined。
其它的就不一一解釋原因了,本質(zhì)就是變量提升和函數(shù)聲明提升的問題。

2018年1月31日 19:51
編輯回答
拼未來

實際上,這段代碼是這么跑的:

~function () {
//hoisting
function a() {
    console.log(2);
}
var a;

alert(a);
a();
a = function () {
    console.log(1);
}

alert(a)
a();
d = a;
var c = d;
}();

alert(d); 
alert(c);

參考:hoisting

2017年5月6日 20:31
編輯回答
乞許

試題與標(biāo)題的this有關(guān)系么。其實本質(zhì)就一點:函數(shù)提升優(yōu)于變量提升,理解這個就好了。并且從這題也能看到函數(shù)定義的函數(shù)申明和函數(shù)表達(dá)式兩種方式的差別。

2018年8月24日 07:08
編輯回答
獨白

這個問題其實是考你對JS預(yù)解析和閉包的理解,
function () {
alert(a); // 因為JS是單線程,而前面沒有聲明a所以這里報錯
a(); //這里也會報錯因為也沒有聲明
var a = function () { // 這里是一個函數(shù)表達(dá)式
console.log(1);
}
function a() { // 這里是聲明一個函數(shù)
console.log(2)
}
alert(a) // 這里會打印一個函數(shù),因為var聲明的a被function聲明的a函數(shù)層疊掉了
a(); // 這里當(dāng)然是函數(shù)調(diào)用 打印2
var c = d = a; // 這里切記 并不是 var a , b ,c ; 所有d沒有聲明
}(); //這是一個閉包也是一個自調(diào)用函數(shù)
alert(d); //這里會報錯
alert(c); // 這里會彈出一個函數(shù)體

2018年1月25日 19:31