進階任務(wù)3(主線任務(wù)):函數(shù)與作用域

任務(wù)

  1. 函數(shù)聲明和函數(shù)表達式有什么區(qū)別
    答:函數(shù)聲明:function functionName(){}
    ??函數(shù)表達式:var fn = function(){}
    ??函數(shù)聲明會提前云茸,函數(shù)表達式可以省略標(biāo)識符(函數(shù)名)梳侨。
  2. 什么是變量的聲明前置蓖捶?什么是函數(shù)的聲明前置
    答:所謂的變量聲明前置就是在一個作用域塊中,所有的變量都被放在塊的開始處聲明辐啄。和變量聲明前置一樣,執(zhí)行代碼之前會先讀取函數(shù)聲明烦租,只要函數(shù)在代碼中進行了聲明豺鼻,無論它在哪個位置上進行聲明,js引擎都會將它的聲明放在范圍作用域的頂部挨约。
  3. arguments 是什么
    答:arguments是一個類數(shù)組對象味混。代表傳給一個function的參數(shù)列表产雹。
    arguments對象是函數(shù)內(nèi)部的本地變量;arguments 已經(jīng)不再是函數(shù)的屬性了翁锡÷冢可以在函數(shù)內(nèi)部通過使用 arguments 對象來獲取函數(shù)的所有參數(shù)。這個對象為傳遞給函數(shù)的每個參數(shù)建立一個條目馆衔,條目的索引號從0開始瘟判。它包括了函所要調(diào)用的參數(shù)。object對象角溃。類數(shù)組拷获。
  4. 函數(shù)的"重載"怎樣實現(xiàn)
    答:在JS中,沒有重載开镣。同名函數(shù)會覆蓋刀诬。但可以在函數(shù)體針對不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯。
    如下面的例子:
  function printPeopleInfo(name, age, sex){
    if(name){
      console.log(name);
    }

    if(age){
      console.log(age);
    }

    if(sex){
      console.log(sex);
    }
  }
  printPeopleInfo('Byron', 26);//Byron 26
  printPeopleInfo('Byron', 26, 'male');//Byron 26 male
  1. 立即執(zhí)行函數(shù)表達式是什么邪财?有什么作用
    答:
(function(){
    var a = 1;
})()

作用: 隔離作用域陕壹。
其他寫法

(function fn1() {});

// 在數(shù)組初始化器內(nèi)只能是表達式
[function fn2() {}];

// 逗號也只能操作表達式
1, function fn3() {};
  1. 求n!,用遞歸來實現(xiàn)
    答:
    遞歸:
    自己調(diào)用自己
    設(shè)定終止條件
    優(yōu)點: 算法簡單
    缺點: 效率低
    求n!
function factor(n){
 if(n === 1) { 
return 1 
} 
return n * factor(n-1) } factor(5)
  1. 以下代碼輸出什么树埠?
function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }

  getInfo('饑人谷', 2, '男');
/*name: 饑人谷
age: 2
sex: 男
name valley*/

  getInfo('小谷', 3);
/*name: 小谷
 age: 3
sex: undefined
 name valley*/

  getInfo('男');
/* name: 男
 age: undefined
 sex: undefined
name valley*/
  1. 寫一個函數(shù)糠馆,返回參數(shù)的平方和?
function sumOfSquares(){ 
    var sum=0; 
    for(var i=0;i<arguments.length;i++){
     sum=sum+arguments[i]*arguments[i];
     } 
  console.log(sum); 
} 
var result = sumOfSquares(2,3,4) 
var result2 = sumOfSquares(1,3) 
console.log(result) //29 
console.log(result2) //10
  1. 如下代碼的輸出怎憋?為什么
console.log(a); 
var a = 1; 
console.log(b);//b is not defined
  1. 如下代碼的輸出又碌?為什么
sayName('world');//hello  world,函數(shù)聲明前置
sayAge(10);//sayAge is not a function绊袋,函數(shù)表達式不前置
function sayName(name){
    console.log('hello ', name);
}
var sayAge = function(age){
    console.log(age);
};
  1. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
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.[[scope]] = globalContext.AO
    bar.[[scope]] = globalContext.AO

  2.調(diào)用bar() barContext = { 
  AO:{ x:30 }, 
Scope:bar.[[scope]] = globalContext.AO 
} 
x變成30
 3.調(diào)用foo() fooContext = { 
AO:{}, 
Scope:foo.[[scope]] = globalContext.AO 
} 
輸出10 */
  1. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
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.[[scope]] = globalContext.AO
    2.調(diào)用bar() 
barContext = { 
AO:{ x:30 }, 
Scope:bar.[[scope]] // globalContext.AO } 
foo.[[scope]] = barContext.AO 
3.調(diào)用foo()
 fooContext = { AO:{}, 
scope:foo.[[scope]] } 
輸出結(jié)果為30 */
  1. 以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
/*1. globalContext = { 
AO:{ x:10
 bar:function }, 
Scope:null
 }
 bar.[[scope]] = globalContext.AO 
2.調(diào)用bar()
 barContext = { 
AO:{ x:30 
function }, 
Scope:bar.[[scope]] //globalContext.AO } 
function.[[scope]] = barContext.AO 
3.調(diào)用立即執(zhí)行函數(shù) 
functionContext = { AO:{}, 
Scope:function.[[scope]]//barContext.AO } 
結(jié)果為30*/
  1. 以下代碼輸出什么毕匀? 寫出作用域鏈查找過程偽代碼
  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)
/*1.
   globalContext = {
        AO:{
            a:1
            fn:function
            fn3:function
        },
        Scope:null } 
  fn.[[scope]] = globalContext.AO 
  fn3.[[scope]] = globalContext.AO 
  2.調(diào)用fn() 
fnContext = {
        AO:{
            a:undefined
            fn2:function
        }, 
  Scope:fn.[[scope]] // globalContext.AO } 
  fn2.[[scope]] = fnContext.AO 
  3. fn3Context = {
        AO:{
            a:200
        }, 
  Scope:fn3Context.[[scope]]//globalContext.AO } 
  fn2ConText = {
        AO:{
            a:20
        }, 
  Scope:fn2ConText.[[scope]]//fnContext.AO } 
  開始執(zhí)行 
  console.log(a)//undefined 打印 
  var a = 5//fnContext中a變成5 
  console.log(a)//5 
  a++//fnContext.AO中a變?yōu)? 
  調(diào)用fn3()
   fn3()中 console.log(a)//globalContext.AO中的a值為1,打印 
  a = 200//globalContext.AO中的a變?yōu)?00 
  調(diào)用fn2() 
  console.log(a);//fnContext.AO中的a值為6癌别,打印 
  a = 20;//fnContext.AO中的a變?yōu)?0 
  繼續(xù)執(zhí)行fn() 
  console.log(a)//fnContext.AO中的a值為20皂岔,打印 
  fn()結(jié)束 
  console.log(a)//globalContext.AO中a值為200,打印
  //輸出的結(jié)果 undefined 5 1 6 20 200 
  */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末展姐,一起剝皮案震驚了整個濱河市躁垛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌圾笨,老刑警劉巖教馆,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異擂达,居然都是意外死亡土铺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舒憾,“玉大人镀钓,你說我怎么就攤上這事《朴兀” “怎么了丁溅?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長探遵。 經(jīng)常有香客問我窟赏,道長,這世上最難降的妖魔是什么箱季? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任涯穷,我火速辦了婚禮,結(jié)果婚禮上藏雏,老公的妹妹穿的比我還像新娘拷况。我一直安慰自己,他們只是感情好掘殴,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布赚瘦。 她就那樣靜靜地躺著,像睡著了一般奏寨。 火紅的嫁衣襯著肌膚如雪起意。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天病瞳,我揣著相機與錄音揽咕,去河邊找鬼。 笑死套菜,一個胖子當(dāng)著我的面吹牛亲善,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逗柴,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逗爹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嚎于?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挟冠,失蹤者是張志新(化名)和其女友劉穎于购,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體知染,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡肋僧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌吠。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡止潘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辫诅,到底是詐尸還是另有隱情凭戴,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布炕矮,位于F島的核電站么夫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肤视。R本人自食惡果不足惜档痪,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邢滑。 院中可真熱鬧腐螟,春花似錦、人聲如沸困后。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽操灿。三九已至锯仪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趾盐,已是汗流浹背庶喜。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救鲤,地道東北人久窟。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像本缠,于是被迫代替她去往敵國和親斥扛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 1. 函數(shù)聲明和函數(shù)表達式有什么區(qū)別 使用function關(guān)鍵字聲明一個函數(shù)時丹锹,聲明不必放到調(diào)用的前面稀颁。//函數(shù)聲...
    _李祺閱讀 274評論 0 0
  • 1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別。 函數(shù)聲明使用function來進行聲明楣黍,函數(shù)聲明提升匾灶,所以不論執(zhí)行語句的位置...
    Rising_suns閱讀 298評論 0 0
  • JavaScript中的函數(shù)運行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里租漂。 函數(shù)聲明和函數(shù)表達式有什么區(qū)...
    畢子歌閱讀 393評論 0 0
  • 1阶女,函數(shù)聲明和函數(shù)表達式有什么區(qū)別 1颊糜、背景介紹 定義函數(shù)的方法主要有三種: 1:函數(shù)聲明(Function De...
    進擊的前端_風(fēng)笑影閱讀 440評論 0 0
  • 1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別 函數(shù)聲明不必放在調(diào)用前面 函數(shù)表達式必須放在調(diào)用前面 2.什么是變量的聲明前置...
    LINPENGISTHEONE閱讀 297評論 0 0