亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

梵蒂岡之花 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條經驗 獲得超5個贊

javascript雖然是解釋執行的語言,但也會進行預編譯。

1

2

3

4

5

6

7

8

9

if(condition){

    function sayHi(){

        alert("Hi!");

    }

}else{

    function sayHi(){

        alert("Yo!");

    }

}

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

而不會顧及if else條件,導致重復的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!");

    };

}

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

不知道有沒有說清楚。

 

 


查看完整回答
反對 回復 2019-07-15
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

我只說第一個。

 

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

 

1. 在前面調用。

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. 在后面調用

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會出現這種情況是因為firefox會把if里面的function定義當作表達式來處理。

 

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.

 

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


 


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

TA貢獻1815條經驗 獲得超6個贊

我來說一下,其實 這個函數等于這樣

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

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



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

TA貢獻1784條經驗 獲得超9個贊

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

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

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

 

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

TA貢獻1817條經驗 獲得超6個贊

當然無效了,定義函數/對象有兩種方式,一般來說效果是差不多,但是也有一點點區別:

方式1,

1

2

3

4

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

function sayHi(){

    alert("Hi!");

}

方式2,

1

2

3

4

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

var sayHi   = function(){

    alert("Hi!");

}

 

查看完整回答
反對 回復 2019-07-15
  • 5 回答
  • 0 關注
  • 379 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號