函數(shù)和作用域

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

函數(shù)聲明必須有標(biāo)識(shí)符,也就是常說(shuō)的函數(shù)名诞丽;函數(shù)表達(dá)式可以省略函數(shù)名.函數(shù)聲明會(huì)提前鹉勒;對(duì)于函數(shù)表達(dá)式,函數(shù)調(diào)用只有在函數(shù)表達(dá)式聲明后調(diào)用;

2.什么是變量的聲明前置逐虚?什么是函數(shù)的聲明前置?

變量的聲明前置是指執(zhí)行代碼之前會(huì)先讀取變量的聲明聋溜,在執(zhí)行的過(guò)程中進(jìn)行賦值, var a=2;一般分為兩步 var a 聲明一個(gè)變量 a 會(huì)放在最前面叭爱,然后在進(jìn)行賦值 a=2撮躁;
函數(shù)的聲明前置意思是在執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明。這就意味著可以把函數(shù)聲明放在調(diào)用它的語(yǔ)句后面买雾。

3.arguments 是什么?

在函數(shù)內(nèi)部,你可以使用arguments對(duì)象獲取到該函數(shù)的所有傳入?yún)?shù)把曼,是我們傳入函數(shù)內(nèi)的實(shí)參;所有的函數(shù)都有屬于自己的一個(gè)arguments對(duì)象漓穿,它包括了函所要調(diào)用的參數(shù)嗤军。他不是一個(gè)數(shù)組,如果用typeof arguments晃危,返回的是’object’叙赚。雖然我們可以用調(diào)用數(shù)據(jù)的方法來(lái)調(diào)用arguments。比如length,還有index方法僚饭。但是數(shù)組的push和pop對(duì)象是不適用的震叮。

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

js中是沒(méi)有重載的;如果想實(shí)現(xiàn)類似函數(shù)重載,我們可以判斷傳入函數(shù)內(nèi)部的參數(shù)的類型和數(shù)目來(lái)執(zhí)行函數(shù)。注:js判斷傳入?yún)?shù)數(shù)量可以用arguments.length這個(gè)屬性來(lái)判斷只锭;判斷類型:
1.用 typeof 語(yǔ)句判斷變量類型惰赋,typeof語(yǔ)句返回類型對(duì)應(yīng)的字符串。
2.用 instanceof 語(yǔ)句判斷變量類型,instanceof語(yǔ)句返回true/false。
3.用 constructor 屬性判斷變量類型,這個(gè)屬性返回用來(lái)構(gòu)造該變量的構(gòu)造函數(shù)引用外邓。

5.立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用

立即執(zhí)行函數(shù)模式是一種語(yǔ)法古掏,可以讓你的函數(shù)在定義后立即被執(zhí)行损话;這種模式本質(zhì)上就是函數(shù)表達(dá)式,在創(chuàng)建后立即執(zhí)行槽唾。因?yàn)楹瘮?shù)的聲明是不可以跟圓括號(hào)的丧枪,但是函數(shù)的表達(dá)式可以;要將函數(shù)聲明轉(zhuǎn)換成函數(shù)表達(dá)式庞萍,就可以在聲明外面加一對(duì)括號(hào)拧烦。在javascript里,括號(hào)內(nèi)部不能包含語(yǔ)句钝计,當(dāng)解析器對(duì)代碼進(jìn)行解釋的時(shí)候恋博,先碰到了()齐佳,然后碰到function關(guān)鍵字就會(huì)自動(dòng)將()里面的代碼識(shí)別為函數(shù)表達(dá)式而不是函數(shù)聲明。

//最常用的模式
(function () {  
    alert('hello world!');  
})(); 
//第二種模式
(function () {  
    alert('watch out!');  
}());  
//還有許多模式

作用:臨時(shí)需要變量的時(shí)候债沮,可以創(chuàng)建私有作用域炼吴,這樣不會(huì)污染到全局,避免了全局變量過(guò)多疫衩,防止命名沖突硅蹦;同時(shí)匿名函數(shù)執(zhí)行完畢后,會(huì)立即銷毀函數(shù)內(nèi)部變量隧土,而匿名函數(shù)又是一個(gè)閉包提针,可以訪問(wèn)自身作用域鏈中的所有變量。這種做法可以減少閉包占用的內(nèi)存問(wèn)題曹傀,因?yàn)闆](méi)有指向匿名函數(shù)的引用。只要函數(shù)執(zhí)行完畢饲宛,就可以立即銷毀其作用域鏈了皆愉。

6.求n!,用遞歸來(lái)實(shí)現(xiàn)

  function factorial(n){
            if(n<=1){
                  return 1;
              }else{
                return n*f(n-1);
             }    
    }
    factorial(n);

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: 男 家淤;Arguments(3) { " valley",2," 男 " }异剥;name valley
getInfo('小谷', 3);// 輸出 name:小谷;age: 3絮重;sex: undefined 冤寿;Arguments(2) { " valley",3};name valley
getInfo('男');// 輸出 name:男青伤;age:  undefined 督怜;sex: undefined ;Arguments(1) { " valley"}狠角;name valley

8. 寫(xiě)一個(gè)函數(shù)号杠,返回參數(shù)的平方和?

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

9. 如下代碼的輸出丰歌?為什么

    console.log(a); //undefined   變量聲明提升姨蟋,但賦值在后 所以為undefined
    var a = 1;
    console.log(b);//報(bào)錯(cuò) b is not defined

10. 如下代碼的輸出?為什么

    sayName('world'); // hello world; 函數(shù)聲明提升
    sayAge(10);  //sayAge is not a function; 函數(shù)表達(dá)式只把變量的聲明提升了立帖。賦值在后面
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };

11. 如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼

var x = 10;
bar() ;
function foo() {
  console.log(x);
}
function bar(){
  var x = 30;
  foo();
}
//分析
globalContext = {
  //全局執(zhí)行上下文
  AO:{
          x:10,
          foo:function(){},
          bar:function(){}
       },
  Scope = null;
  };
foo.[[Scope]] = globalContext.AO;
bar.[[Scope]] = globalContext.AO;
bar執(zhí)行的時(shí)候進(jìn)入bar的執(zhí)行上下文:
barContext = {
      //bar的執(zhí)行上下文
      AO:{
          x:30
          },
    Scope:bar.[[Scope]]
}
fooContext = {
       //foo的執(zhí)行上下文
         AO:{
             },
     Scope:foo.[[Scope]]
}

分析:首先將變量聲明 函數(shù)聲明提升眼溶;執(zhí)行bar函數(shù)進(jìn)入bar函數(shù)的執(zhí)行上下文;bar函數(shù)執(zhí)行過(guò)程中執(zhí)行foo函數(shù)厘惦,會(huì)先在bar的AO中尋找foo函數(shù)偷仿,沒(méi)有再進(jìn)入bar.[[Scope]]尋找哩簿。執(zhí)行foo函數(shù)進(jìn)入foo函數(shù)的執(zhí)行上下文,執(zhí)行console.log(x)酝静;首先在foo自己的AO中找x节榜,沒(méi)有就進(jìn)入foo.[[Scope]]中尋找所以console.log(x)打印出來(lái)的值為10;

12. 如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼

 var x = 10;
  bar(); 
 function bar(){
   var x = 30;
  function foo(){
       console.log(x); 
       }
    foo();
}   
//全局執(zhí)行上下文:
globalContext = {
      AO:{
         x:10,
          bar:function(){}  
        }
        Scope:null
    }
bar.[[Scope]] = globalContext.AO;
//bar的執(zhí)行上下文
 barContext = {
        AO:{
          x:30,
          foo:function(){}
             },
          Scope: bar.[[Scope]] 
    }
foo.[[Scope]] = barContext.AO;
//foo的執(zhí)行上下文
 fooContext = {
        AO:{
        },
        Scope:foo.[[Scope]]
  }

分析:先進(jìn)行全局和函數(shù)內(nèi)部的變量聲明提升 函數(shù)聲明提升别智,執(zhí)行bar函數(shù)先在globalContext.AO中尋找函數(shù)bar宗苍,執(zhí)行bar函數(shù)進(jìn)入bar函數(shù)的執(zhí)行上下文;bar函數(shù)內(nèi)部執(zhí)行foo函數(shù)先在barContext.AO 中尋找foo函數(shù)找到后執(zhí)行console.log(x)薄榛;x先在fooContext.AO中尋找讳窟,沒(méi)有進(jìn)入foo.[[Scope]]尋找也就是 barContext.AO中尋找x=30,所以打印結(jié)果為30.

13.如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼

var x = 10;
bar(); 
function bar(){
  var x = 30;
  (function (){
    console.log(x);
  })();
}

分析:同上因?yàn)榱⒓磮?zhí)行函數(shù)可以看做一個(gè)函數(shù)表達(dá)式類似于var fn = function(){}; 然后立即執(zhí)行fn();匿名函數(shù)執(zhí)行上下文的Scope屬性為barContext.AO敞恋,找到x為30丽啡;打印結(jié)果為30.

14.如下代碼輸出什么? 寫(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);

分析過(guò)程:
首先在全局和函數(shù)內(nèi)部進(jìn)行變量聲明提升和函數(shù)聲明提升;

//全局執(zhí)行上下文:
        globalContext = {
            AO:{
            a:1,//變化順序1;200
            fn:function(){},
            fn3:function(){}    
            },
            Scope:null
        }
        fn.[[Scope]] = globalContext.AO;
        fn3.[[Scope]] = globalContext.AO;
        //fn函數(shù)執(zhí)行上下文:
        fnContext = {
            AO:{
            a:,//執(zhí)行過(guò)程a值得變化  undefined;5;6;20
            fn2:function(){}    
            },
            Scope:fn.[[Scope]]
        }
        fn2.[[Scope]] = fnContext.AO;
        //fn2的執(zhí)行上下文
        fn2Context = {
            AO:{
                
            },
            Scope:fn2.[[Scope]]
        }
        //fn3的執(zhí)行上下文
        fn3Context = {
            AO:{
            
            },
            Scope:fn3.[[Scope]]
        }

執(zhí)行程序分析:全局環(huán)境下執(zhí)行fn,在globalContext.AO中找到fn函數(shù)執(zhí)行fn,第一次console.log(a),在fnContext.AO找到a只聲明未賦值為undefined,對(duì)a賦值5,第二次console.log(a)結(jié)果為5,a++ a為6,var a重新聲明a不會(huì)對(duì)a值產(chǎn)生影響,執(zhí)行fn3函數(shù)進(jìn)入fn3函數(shù)的執(zhí)行上下文,console.log(a),先在fn3Context.AO中尋找a,全局聲明的a找不到,在fn3.[[Scope]]中找到全局的var a = 1;console.log(a)即為1;隨后全局的a被賦值為200,繼續(xù)往下執(zhí)行fn2進(jìn)入fn2的執(zhí)行上下文,首先在fn2Context.AO中尋找a,沒(méi)有進(jìn)入fn2.[[Scope]]尋找此時(shí)a為a++后的6,打印出6;隨后a = 20修改了fn執(zhí)行上下文的a為20;再在fn內(nèi)部console.log(a),得到20;最后在全局console.log(a),此時(shí)全局的a為200;最后打印結(jié)果為undefined 5 1 6 20 200

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硬猫,一起剝皮案震驚了整個(gè)濱河市补箍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸蜜,老刑警劉巖坑雅,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衬横,居然都是意外死亡裹粤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蜂林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遥诉,“玉大人,你說(shuō)我怎么就攤上這事悉尾⊥荒牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵构眯,是天一觀的道長(zhǎng)愕难。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惫霸,這世上最難降的妖魔是什么猫缭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮壹店,結(jié)果婚禮上猜丹,老公的妹妹穿的比我還像新娘。我一直安慰自己硅卢,他們只是感情好射窒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布藏杖。 她就那樣靜靜地躺著,像睡著了一般脉顿。 火紅的嫁衣襯著肌膚如雪蝌麸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天艾疟,我揣著相機(jī)與錄音来吩,去河邊找鬼。 笑死蔽莱,一個(gè)胖子當(dāng)著我的面吹牛弟疆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盗冷,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怠苔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仪糖?” 一聲冷哼從身側(cè)響起嘀略,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乓诽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咒程,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠天,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帐姻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稠集。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饥瓷,靈堂內(nèi)的尸體忽然破棺而出剥纷,到底是詐尸還是另有隱情,我是刑警寧澤呢铆,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布晦鞋,位于F島的核電站,受9級(jí)特大地震影響棺克,放射性物質(zhì)發(fā)生泄漏悠垛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一娜谊、第九天 我趴在偏房一處隱蔽的房頂上張望确买。 院中可真熱鬧,春花似錦纱皆、人聲如沸湾趾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搀缠。三九已至铛楣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胡嘿,已是汗流浹背蛉艾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衷敌,地道東北人勿侯。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缴罗,于是被迫代替她去往敵國(guó)和親助琐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 一面氓、函數(shù)聲明和函數(shù)表達(dá)式 函數(shù)聲明的形式:function fn() { } ,使用函數(shù)聲明的形式聲明一個(gè)函數(shù)時(shí)兵钮,...
    sutingy閱讀 164評(píng)論 0 0
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行舌界,但...
    Sheldon_Yee閱讀 399評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 函數(shù)聲明 函數(shù)表達(dá)式 函數(shù)聲明:函數(shù)調(diào)用可以發(fā)生在函數(shù)聲明之前,例如下...
    TimeLesser閱讀 395評(píng)論 4 4
  • Soarse閱讀 204評(píng)論 0 0
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明是使用function來(lái)進(jìn)行聲明的,可以不用在意調(diào)用函數(shù)的前后位置呻拌,是...
    向前沖沖的蝸牛閱讀 232評(píng)論 0 0