在高級(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á)式的。
使用函數(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ì)
現(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ù)。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。