JS函數(shù)作用域鏈

1.函數(shù)聲明和函數(shù)表達式

函數(shù)聲明和函數(shù)表達式都可以聲明函數(shù)恼琼,但使用函數(shù)聲明的方法屏富,聲明不必放在調用前;使用函數(shù)表達式噩死,聲明需要在調用前,可以省略函數(shù)名行嗤。
例:

 function sayHello(){
    console.log('hello')
  } 
//函數(shù)聲明

var sayHello = function(){
    console.log('hello');
  }
//函數(shù)表達式

2.變量與函數(shù)的聲明前置

在一個作用域下垛耳,var聲明的變量和function聲明的函數(shù)會前置,聲明的語句會優(yōu)先執(zhí)行既琴。

3.arguments 對象

Arguments是個類似數(shù)組但不是數(shù)組的對象泡嘴,說他類似數(shù)組是因為其具備數(shù)組相同的訪問性質及方式,能夠由arguments[n]來訪問對應的單個參數(shù)的值磺箕,并擁有數(shù)組長度屬性length抛虫。還有就是arguments對象存儲的是實際 傳遞給函數(shù)的參數(shù)建椰,而不局限于函數(shù)聲明所定義的參數(shù)列表,而且不能顯式創(chuàng)建 arguments 對象棉姐。

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

JavaScript不支持函數(shù)的重載伞矩,即不能夠定義同樣的函數(shù)然后通過編譯器去根據(jù)不同的參數(shù)執(zhí)行不同的函數(shù)。但可以在函數(shù)內部定義多種模式苛让,根據(jù)傳進來的參數(shù)信息進行匹配炮捧。

5.立即執(zhí)行函數(shù)表達式

立即執(zhí)行函數(shù)表達式是一種可以使函數(shù)在被定義后立即執(zhí)行的一種寫法混萝,在javascript里期奔,括號內部不能包含語句浦旱,當解析器對代碼進行解釋的時候颁湖,先碰到了()例隆,然后碰到function關鍵字就會自動將()里面的代碼識別為函數(shù)表達式而不是函數(shù)聲明。例如下面的代碼:

(function(){
  var a  = 1;
})()
console.log(a); //undefined

立即執(zhí)行函數(shù)表達式的作用:一是不必為函數(shù)命名镰禾,避免了污染全局變量唱逢;二是IIFE內部形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變量备韧。避免了污染全局變量痪枫。

6.求n!,用遞歸來實現(xiàn)

function factor(n){
  if(n === 1) {
    return 1
  }
  return n * factor(n-1)
}

var result=factor(5);
console.log(result)

7.以下代碼輸出什么易阳?

    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: 男 ["饑人谷", 2, "男"]  name valley
getInfo('小谷', 3);     //結果:name:小谷 age:3 undefined ["小谷", 3] name vally
getInfo('男');  //結果: name:男 undefined undefined ["男"] name vally

8. 寫一個函數(shù)吃粒,返回平方和

   function sumOfSquares(){
         var sum=0;
         for(var i=0;i<arguments.length;i++){
               sum=sun+arguments[i]*arguments[i]
               return sum;
         }
   }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10

9. 如下代碼的輸出徐勃?

    console.log(a); //輸出undefined,因為變量a聲明提前很魂,但此時還未被賦值
    var a = 1;
    console.log(b); //報錯“b is not defined”檐涝,因為b未被聲明

10. 如下代碼的輸出?

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name); //輸出hello world幅聘,因為函數(shù)聲明提前
    }
    var sayAge = function(age){
        console.log(age); //報錯窃植,因為使用函數(shù)表達式必須在其后調用,否則認為sayAge不是函數(shù)
    };

11. 作用域鏈查找過程偽代碼 葛超,舉例如下:

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}
/*****************************************************************************/
//作用域鏈查找過程如下:
//首先全局作用域中聲明的變量有:x,函數(shù)有foo(),bar()
globalContext = {
    AO:{
        x:10
        foo:function
        bar:function
    },
    Scope:null
}
//此時被聲明的函數(shù)foo(),bar()的scope為 globalContext.AO
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
//繼續(xù)執(zhí)行答渔,進入bar的執(zhí)行上下文
barContext = {
    AO:{
     x:30
    }
    scope:bar.[[scope]] = globalContext.AO
}
//調用foo從scope中找到沼撕,進入foo的執(zhí)行上下文
fooContext = {
    AO:{    
    }
    scope:foo.[[scope]] = globalContext.AO
}
//從foo的scope:globalContext.AO中找到x:10芜飘,所以輸出10。

輸出10

12. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}
/***********************************************************************/
//全局作用域中聲明變量x,函數(shù)bar()
globalContext = {
  AO: {
    x: 10
    bar: function
  }
  Scope: null
}
//此時被聲明的bar()的scope為globalContext.AO
bar.[[scope]] = globalContext.AO
//進入bar執(zhí)行上下文
barContext = {
  AO: {
    x: 30
    foo: function
  }
  Scope: bar.[[scope]] = globalContext.AO
}
//foo()被聲明笼沥,它的scope為barContext.AO
foo.[[scope]] = barContext.AO

fooContext = {
  AO: {  }
  Scope: foo.[[scope]] = barContext.AO
}

輸出為30

13. 以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼

var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
/************************************************************************************************/
//全局作用域聲明變量x敬拓,函數(shù)bar()
globalContext = {
  AO: {
    x: 10
    bar: function
  }
  Scope: null
}
bar.[[scope]] = globalContext.AO

barContext = {
  AO: {
    x: 30
    anonymous:function //匿名函數(shù)anonymous
  }
  Scope: bar.[[scope]] = globalContext.AO
}
anonymous.[[scope]] = barContext.AO

anonymousContext = {
  AO: { }
  Scope: anonymous.[[scope]] = barContext.AO
} 

輸出為30

14. 以下代碼輸出什么裙戏? 寫出作用域鏈查找過程偽代碼

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)
/************************************************************************************************/
globalContext = {
  AO: {
    a: 1
    fn: function
    fn3: function
  }
  Scope: null
}
fn.[[scope]] = globalContext.AO
fn3.[[scope]] = globalContext.AO

fnContext = {
  AO: {
    a: undefined
    fn2: function
  }
  Scope: fn.[[scope]] = globalContext.AO
}
fn2.[[scope]] = fnContext.AO
//進入fn后先輸出undefined累榜,a賦值為5后輸出5
fn3Context = {
  AO: {}
  Scope: fn3.[[scope]] = globalContext.AO
}
 //輸出:1
fn2Context = {
  AO: {}
  Scope: fn2.[[scope]] = fnContext.AO
}
console.log(a) //輸出200

最后結果為:undefined 5 1 6 200

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末壹罚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赂蠢,更是在濱河造成了極大的恐慌辨泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件第岖,死亡現(xiàn)場離奇詭異蔑滓,居然都是意外死亡,警方通過查閱死者的電腦和手機键袱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門杠纵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事银亲∨Τ祝” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵馏段,是天一觀的道長践瓷。 經常有香客問我,道長晕翠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任硫麻,我火速辦了婚禮樊卓,結果婚禮上碌尔,老公的妹妹穿的比我還像新娘。我一直安慰自己奢赂,他們只是感情好颈走,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轧钓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弛房。 梳的紋絲不亂的頭發(fā)上而柑,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天媒咳,我揣著相機與錄音粹排,去河邊找鬼。 笑死涩澡,一個胖子當著我的面吹牛顽耳,可吹牛的內容都是我干的。 我是一名探鬼主播妙同,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼射富,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粥帚?” 一聲冷哼從身側響起胰耗,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茎辐,沒想到半個月后宪郊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡弛槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了依啰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乎串。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖速警,靈堂內的尸體忽然破棺而出叹誉,到底是詐尸還是另有隱情,我是刑警寧澤闷旧,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布长豁,位于F島的核電站,受9級特大地震影響忙灼,放射性物質發(fā)生泄漏匠襟。R本人自食惡果不足惜钝侠,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酸舍。 院中可真熱鬧帅韧,春花似錦、人聲如沸啃勉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮阐。三九已至叮阅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泣特,已是汗流浹背帘饶。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留群扶,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓镀裤,卻偏偏與公主長得像竞阐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暑劝,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,233評論 0 4
  • 繼承 一骆莹、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關的對象共享這一特性担猛,可以實現(xiàn)繼承幕垦,這種實現(xiàn)繼承的...
    magic_pill閱讀 1,061評論 0 3
  • 作用域鏈:JavaScript需要查詢一個變量x時,首先會查找作用域鏈的第一個對象傅联,如果以第一個對象沒有定義x變量...
    風___________閱讀 270評論 0 0
  • 昨晚經不住老公一再申請先改,家里今年第一次開了空調,睡覺時蒸走,就覺腳底呼呼過風仇奶,把毛巾被裹在腳上,才得一夜安睡比驻。 上午幾...
    misang閱讀 185評論 1 4
  • 在這給大家分享一下我的大學生活该溯,有點空虛有點冷,但是我在慢慢改變自己别惦,也希望能在畢業(yè)之前活出一個像樣的自己狈茉,也能過...
    ShaulQiao閱讀 398評論 0 2