第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問各位大神JavaScript:函數(shù)聲明與函數(shù)表達式

請問各位大神JavaScript:函數(shù)聲明與函數(shù)表達式

梵蒂岡之花 2019-07-15 12:07:58
為什么這個是無效語法呢if(condition){function sayHi(){alert("Hi!");}}else{function sayHi(){alert("Yo!");}}而下面這個確是有效的var sayHi;if(condition){sayHi=function sayHi(){alert("Hi!");};}else{sayHi=function sayHi(){alert("Yo!");};}
查看完整描述

5 回答

?
江戶川亂折騰

TA貢獻1851條經(jīng)驗 獲得超5個贊

javascript雖然是解釋執(zhí)行的語言,但也會進行預(yù)編譯。

1

2

3

4

5

6

7

8

9

if(condition){

    function sayHi(){

        alert("Hi!");

    }

}else{

    function sayHi(){

        alert("Yo!");

    }

}

這種形式,JS引擎在預(yù)編譯的過程中會注冊方法到window對象下,就是window.sayHi。

而不會顧及if else條件,導(dǎo)致重復(fù)的sayHi方法被注冊,在這種情況下是無效語法。

1

2

3

4

5

6

7

8

9

10

var sayHi;

if(condition){

    sayHi=function sayHi(){

        alert("Hi!");

    };

}else{

    sayHi=function sayHi(){

        alert("Yo!");

    };

}

而下面這種是作為一個 變量(而非函數(shù)function),變量是可以被重復(fù)賦值的,所以語法不會有問題。

不知道有沒有說清楚。

 

 


查看完整回答
反對 回復(fù) 2019-07-15
?
Qyouu

TA貢獻1786條經(jīng)驗 獲得超11個贊

我只說第一個。

 

第一個語法上沒什么問題,但是和瀏覽器解析js不同而獲得意想不到的結(jié)果。

 

1. 在前面調(diào)用。

1

2

3

4

5

6

7

8

9

10

11

sayHi();

var condition   = true;

if(condition){

    function sayHi(){

        alert("Hi!");

    }

}else{

    function sayHi(){

        alert("Yo!");

    }

}

這種時候除了firefox會報錯,其他的瀏覽器會彈出“Yo!"。

 

2. 在后面調(diào)用

1

2

3

4

5

6

7

8

9

10

if(true){

    function sayHi(){

        alert("Hi!");

    }

}else{

    function sayHi(){

        alert("Yo!");

    }

}

sayHi();

firefox會彈出"Hi!",其他的瀏覽器會彈出"Yo!"。

 

這里firefox會出現(xiàn)這種情況是因為firefox會把if里面的function定義當(dāng)作表達式來處理。

 

MDN的原文

Functions can be conditionally declared. That is, a function definition can be nested within an if statement. Technically, such declarations are not actually function declarations; they are function expressions.

 

所以這種不兼容的方法不要使用。


 


查看完整回答
反對 回復(fù) 2019-07-15
?
紅糖糍粑

TA貢獻1815條經(jīng)驗 獲得超6個贊

我來說一下,其實 這個函數(shù)等于這樣

function sayHi(){
alert('hi')
}
function sayHi(){
alert('Yo')
}

你寫的第一個無效那個,等于分開寫,下面的就會把上面的覆蓋掉,只顯示下面的了



查看完整回答
反對 回復(fù) 2019-07-15
?
千萬里不及你

TA貢獻1784條經(jīng)驗 獲得超9個贊

實在不明白你這段代碼的目的。

如果你只是需要在不同的condition提示不同的alert, 那么只需要如下就可以了。
if(condition){
alert("Hi!");
}else{
alert("Yo!");
}

如果你需要在不同的condition定義不同的SayHi()函數(shù)。那么很明顯,只有下面的才是正確的。
上面的做法不管從任何角度看都是亂來。 如果JS支持把局部定義默認為全局的(PHP可以),那么上面這樣就叫重復(fù)定義。如果JS不支持把局部當(dāng)全局用,那么你上面的做法跳出if/else的范圍,此函數(shù)為未定義(不存在).

 

查看完整回答
反對 回復(fù) 2019-07-15
?
慕的地6264312

TA貢獻1817條經(jīng)驗 獲得超6個贊

當(dāng)然無效了,定義函數(shù)/對象有兩種方式,一般來說效果是差不多,但是也有一點點區(qū)別:

方式1,

1

2

3

4

//這種定義,瀏覽器首先會把所有的函數(shù)定義先預(yù)留

function sayHi(){

    alert("Hi!");

}

方式2,

1

2

3

4

//這種定義,瀏覽器運行到這一行,才會定義函數(shù)

var sayHi   = function(){

    alert("Hi!");

}

 

查看完整回答
反對 回復(fù) 2019-07-15
  • 5 回答
  • 0 關(guān)注
  • 366 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號