函數(shù)

函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別

聲明一個(gè)函數(shù)有三種方式
1.用function聲明一個(gè)函數(shù):


2.函數(shù)表達(dá)式方法:


3.function構(gòu)造函數(shù)的方法(一般不使用):


因?yàn)樽兞刻嵘脑蛎删撸瘮?shù)表達(dá)式的方法提升的是var print球榆,所以用function聲明的函數(shù)在執(zhí)行時(shí),會(huì)把函數(shù)提升到j(luò)s語(yǔ)句的頂部禁筏,所以即使函數(shù)調(diào)用出現(xiàn)在函數(shù)聲明的前面持钉,也不會(huì)出現(xiàn)報(bào)錯(cuò);而用函數(shù)表達(dá)式的方法聲明的函數(shù)提升的是var定義的變量篱昔,所以會(huì)報(bào)錯(cuò)每强。

什么是變量的聲明前置始腾?什么是函數(shù)的聲明前置

JS語(yǔ)言的特性是JS引擎在解析JS代碼時(shí)會(huì)先獲取所有被聲明的變量然后再一行一行的運(yùn)行,所以所有var聲明的變量和function聲明的函數(shù)會(huì)前置到代碼頭部空执,所以使用或調(diào)用在其后的變量或函數(shù)也不會(huì)報(bào)錯(cuò)

arguments 是什么

arguments是一個(gè)類數(shù)組對(duì)象浪箭,對(duì)應(yīng)于傳遞給函數(shù)的參數(shù),可以通過(guò)索引的方式訪問(wèn)函數(shù)傳入的參數(shù)辨绊,arguments[i]奶栖,i為數(shù)組中元素的索引

函數(shù)的"重載"怎樣實(shí)現(xiàn)

JS里因?yàn)橥瘮?shù)會(huì)被覆蓋所以沒(méi)有重載,但是可以在函數(shù)體針對(duì)不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯(模擬重載)


注意:傳參時(shí)需注意傳入?yún)?shù)的順序

立即執(zhí)行函數(shù)表達(dá)式是什么门坷?有什么作用
立即執(zhí)行函數(shù)的作用是隔離作用域宣鄙,使被執(zhí)行的函數(shù)內(nèi)部的變量不會(huì)污染到外部,即外部不能訪問(wèn)函數(shù)內(nèi)部的變量默蚌。寫(xiě)法:

  1.       (function fn(){})()
    
  2.       [function fn(){}]()
    
  3.       !function fn(){}()
    
求n!冻晤,用遞歸來(lái)實(shí)現(xiàn)

打印結(jié)果:

寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和绸吸?
如下代碼的輸出鼻弧?為什么
   console.log(a);
   var a = 1;
   console.log(b);

因?yàn)槁暶髑爸茫陨厦娲a等價(jià)于:

var a
console.log(a);
a = 1;
console.log(b);

所以console.log(a)輸出 undefined
console.log(b)輸出b is not defined

如下代碼的輸出锦茁?為什么
sayName('world');
sayAge(10);
function sayName(name){
    console.log('hello ', name);
}
var sayAge = function(age){
    console.log(age);
};

聲明前置所以代碼等價(jià)于:

   function sayName(name){
    console.log('hello ', name);
}
   var sayAge
   sayName('world');
   sayAge(10);
   sayAge = function(age){
    console.log(age);
};

所以sayName('world');輸出 hello world
sayAge(10);輸出 sayAge is not a function

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}

偽代碼:

 1.globalContext = {
      AO: {
        x: 10
        foo: function(){}
        bar: function(){}
      }
   Scope: null
   }
// 聲明 foo 時(shí) 得到下面
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
//調(diào)用bar()時(shí) 進(jìn)入bar()的執(zhí)行上下文
2. barContext={
    AO: {
        x:30
    }
    bar.[[scope]] = globalContext.AO
    }
//調(diào)用foo()時(shí) 進(jìn)入foo()的執(zhí)行上下文
3. fooContext={
    AO:{    }
    foo.[[scope]] = globalContext.AO
    }

foo( )的x是globalContext的x 所以輸出10

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10;
   bar() 
function bar(){
   var x = 30;
   function foo(){
       console.log(x) 
   }
  foo();
 }  

偽代碼:

1.globalContext = {
      AO: {
        x: 10
        bar: function(){}
      }
   Scope: null
   }
// 聲明 bar 時(shí) 得到下面
bar.[[scope]] = globalContext.AO
2. barContext = {
     AO: {
     x: 30,
     foo: function
 },
    Scope: bar.[[scope]] //globalContext.AO
 }
    foo.[[scope]] = barContext.AO
3. fooContext = {
    AO: {},
    Scope: foo.[[scope]] // barContext.AO
 }

調(diào)用foo( )時(shí)先在foo的AO里找温数,找不到再去bar的AO里找 所以輸出30

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10;
bar() 
function bar(){
   var x = 30;
   (function (){
      console.log(x)
   })()
}

執(zhí)行過(guò)程同上一題但是bar內(nèi)嵌套的是一個(gè)立即執(zhí)行函數(shù)聲明以后立即調(diào)用并執(zhí)行自身同時(shí)其內(nèi)部沒(méi)有x變量所以會(huì)去bar的AO里找所以輸出 30

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var a = 1;

function fn(){
  console.log(a)
  var a = 5
  console.log(a)
  a++
  var a
  fn3()
  fn2()
  console.log(a)

  function fn2(){
    console.log(a)
    a = 20
  }
}

 function fn3(){
   console.log(a)
  a = 200
}

fn()
console.log(a)

聲明前置后:

var a = 1;

function fn(){
  var a
  console.log(a)
  a = 5
  console.log(a)
  a++
  fn3()
  fn2()
  console.log(a)

  function fn2(){
    console.log(a)
    a = 20
  }
}

 function fn3(){
   console.log(a)
  a = 200
}

執(zhí)行過(guò)程如下:調(diào)用fn( )后進(jìn)入其執(zhí)行上下文,首先var a但未賦值所以打印undefined后 a=5所以打印5蜻势,a++此時(shí)fn內(nèi)部a為6,調(diào)用fn3時(shí)進(jìn)入fn3的執(zhí)行上下文首先打印1后a=200污染了全局變量a鹉胖,執(zhí)行完退出調(diào)用fn2進(jìn)入fn2的執(zhí)行上下文打印6握玛,執(zhí)行a=20污染了fn內(nèi)部的變量a所以打印出20最后在打印200

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甫菠,隨后出現(xiàn)的幾起案子挠铲,更是在濱河造成了極大的恐慌,老刑警劉巖寂诱,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拂苹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痰洒,警方通過(guò)查閱死者的電腦和手機(jī)瓢棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丘喻,“玉大人脯宿,你說(shuō)我怎么就攤上這事∪郏” “怎么了连霉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵榴芳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我跺撼,道長(zhǎng)窟感,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任歉井,我火速辦了婚禮柿祈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酣难。我一直安慰自己谍夭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布憨募。 她就那樣靜靜地躺著紧索,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菜谣。 梳的紋絲不亂的頭發(fā)上珠漂,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音尾膊,去河邊找鬼媳危。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冈敛,可吹牛的內(nèi)容都是我干的待笑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抓谴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暮蹂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起癌压,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仰泻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滩届,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體集侯,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年帜消,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棠枉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡券犁,死狀恐怖术健,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粘衬,我是刑警寧澤荞估,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布咳促,位于F島的核電站,受9級(jí)特大地震影響勘伺,放射性物質(zhì)發(fā)生泄漏跪腹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一飞醉、第九天 我趴在偏房一處隱蔽的房頂上張望冲茸。 院中可真熱鬧,春花似錦缅帘、人聲如沸轴术。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逗栽。三九已至,卻和暖如春失暂,著一層夾襖步出監(jiān)牢的瞬間彼宠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工弟塞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凭峡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓决记,卻偏偏與公主長(zhǎng)得像摧冀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子系宫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會(huì)率先讀取函數(shù)聲明按价,并使其在執(zhí)行任何代碼之前可以訪問(wèn);函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 385評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加笙瑟,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行,但...
    Sheldon_Yee閱讀 396評(píng)論 0 1
  • 問(wèn)答題 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)答://函數(shù)聲明function hello(){ conso...
    饑人谷_桶飯閱讀 243評(píng)論 0 0
  • 一癞志、函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別往枷?(*) ECMAScript里面規(guī)定了三種聲明函數(shù)的方式: 構(gòu)造函數(shù)函數(shù)也是對(duì)...
    婷樓沐熙閱讀 457評(píng)論 0 2
  • 我喜歡走在路上,那種前方有什么東西等著我的到來(lái)的感覺(jué)真好凄杯,我覺(jué)得旅行的形式有很多種错洁,不只是走出自己的城市,...
    汪先生和陳太太閱讀 329評(píng)論 0 3