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

鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 高級(jí)程序設(shè)計(jì)第7章,函數(shù)聲明和函數(shù)表達(dá)式區(qū)別

高級(jí)程序設(shè)計(jì)第7章,函數(shù)聲明和函數(shù)表達(dá)式區(qū)別

在高級(jí)程序設(shè)計(jì)第7章中,提到,函數(shù)聲明和函數(shù)表達(dá)式區(qū)別舉例。
為什么說,以下代碼屬于無效代碼?js會(huì)嘗試修正錯(cuò)誤?
大多數(shù)瀏覽器會(huì)返回第二個(gè)聲明,忽略condition;Firefox會(huì)在condition為true時(shí)返回第一個(gè)聲明?
我試了在chrome下,沒有忽略啊,這段話什么意思?

  if(conditon){
    function sayHi(){        
        alert('hi');
    }
  } 
  else{
    function sayHi(){        
            alert('yo');
        }
   }
回答
編輯回答
不二心

JS 執(zhí)行的時(shí)候是先掃描一邊代碼,把根據(jù)聲明定義所有變量和函數(shù),然后再去掉聲明執(zhí)行這些代碼。
我記得標(biāo)準(zhǔn)里好像沒有說函數(shù)聲明是不是可以放在 if但是一般認(rèn)為根據(jù)上面的說法,放在 if 里根據(jù)條件定義不同的函數(shù)是不可以的,因?yàn)閳?zhí)行之前掃描代碼的時(shí)候condition的值是不知道的,瀏覽器無法確定用哪個(gè)聲明。對(duì)于標(biāo)準(zhǔn)里沒有寫的東西,瀏覽器怎么做就看心情了 。對(duì)于函數(shù), 標(biāo)準(zhǔn)里寫的是,如果有重名函數(shù),代碼開始執(zhí)行的時(shí)候以后者為準(zhǔn)(因?yàn)樵诖a里可以在改變這個(gè)函數(shù)的值)。參考這里http://zonxin.github.io/post/... 。 所以如果瀏覽器不處理這種情況,按照標(biāo)準(zhǔn)做的話,那么將會(huì)使用靠后的函數(shù)。

函數(shù)表達(dá)式有兩種語法,其中一種是匿名函數(shù),另一種是 function fn() {},這種形式在語法上和函數(shù)聲明是一樣的,但是一般情況下我們大概這么寫才是函數(shù)表達(dá)式var f = function fn() {},如果直接寫成function fn() {} 會(huì)被瀏覽器認(rèn)為是函數(shù)聲明。

function a()
{
    var variable = 0;
    function fn() {}
    fn();
}
// 瀏覽器在執(zhí)行的時(shí)候其實(shí)是執(zhí)行的
function a()
{   // 去掉所有聲明,當(dāng)然已經(jīng)事先創(chuàng)建了對(duì)應(yīng)的局部變量和函數(shù)
    variable = 0;
    fn();
}


function b()
{
    var f = function fn() {};
    fn();
}
// 如果把 function fn() {} 當(dāng)作函數(shù)聲明,那么第一句將實(shí)際執(zhí)行的是
f = ; // 顯然這是不合法的,因此 `function fn() {}` 是函數(shù)表達(dá)式

上面的的例子可能不太恰當(dāng),只是為了說明,從語法上來說函數(shù)聲明和其中一種的函數(shù)表達(dá)式的語法雖然一樣,但是還是可以從語義上區(qū)分函數(shù)聲明和函數(shù)表達(dá)式的。

2017年6月11日 22:00
編輯回答
苦妄

使用函數(shù)聲明,所有聲明的函數(shù)都會(huì)被提到代碼最上方去定義,所以像下面這樣是能正常執(zhí)行的:

fn();
// hi

function fn(){ console.log("hi") }

如果使用函數(shù)表達(dá)式,那會(huì)在代碼執(zhí)行到那一行的時(shí)候才會(huì)去定義函數(shù),所以下面的代碼就會(huì)報(bào)錯(cuò):

fn();
// fn is not a function

const fn = function(){ console.log("hi") };

如果你把函數(shù)聲明寫在表達(dá)式里面,不同的瀏覽器,有的會(huì)給你做補(bǔ)正,有的不會(huì)

2017年11月20日 14:26
編輯回答
安淺陌

函數(shù)聲明會(huì)提到前面,所以不建議多次聲明(定義)更不說在if之類的邏輯語句中進(jìn)行聲明了,而函數(shù)表達(dá)式實(shí)質(zhì)是匿名函數(shù)對(duì)象定義后賦值,所以在if中不會(huì)出現(xiàn)問題。

  if(conditon){
    sayHi=function(){        
        alert('hi');
    }
  } 
  else{
    sayHi=function(){        
            alert('yo');
        }
   }

這樣就沒有問題

2017年5月19日 23:54
編輯回答
怣痛

現(xiàn)在的主流瀏覽器都會(huì)幫你糾正錯(cuò)誤,放回第一個(gè),跟函數(shù)表達(dá)式一樣,ie8下面是放回第二個(gè)。

var conditon = true;
     if(conditon){
    function sayHi(){        
        alert('hi');
    }
  } 
  else{
    function sayHi(){        
            alert('yo');
        }
   }
    sayHi();
var conditon = true;
    sayHi();
      if(conditon){
    function sayHi(){        
        alert('hi');
    }
  } 
  else{
    function sayHi(){        
            alert('yo');
        }
   }

ie8下面都是提示‘yo’,調(diào)用sayhi(),他會(huì)先去找sayhi的聲明,當(dāng)然是找最后一個(gè)聲明sayhi的函數(shù)。

2017年12月10日 00:43