函數(shù)與作用域

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

函數(shù)聲明

     function fn() {}
     fn();

1 函數(shù)聲明必須有函數(shù)名
2 函數(shù)可以在任意地方調(diào)用fn();

函數(shù)表達(dá)式

var fn = function fn () {};
1 前后兩個(gè)函數(shù)的名字可以相同也可以不相同
2 function 后面的這個(gè)名字是可以省略的
3 function 后面的這個(gè)名字只能再函數(shù)內(nèi)部使用
4 函數(shù)調(diào)用只有在函數(shù)表達(dá)式聲明后調(diào)用炼彪。

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

變量聲明前置:在一個(gè)作用域塊中,所有的變量都被放在塊的開始出聲明几蜻。
函數(shù)的聲明前置:和變量聲明前置一樣溪厘,執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明五续,只要函數(shù)在代碼中進(jìn)行了聲明可霎,無論它在哪個(gè)位置上進(jìn)行聲明科乎,js引擎都會(huì)將它的聲明放在范圍作用域的頂部割卖。

arguments 是什么

arguments是一個(gè)類數(shù)組對(duì)象前酿。代表傳給一個(gè)function的參數(shù)列表。
??arguments對(duì)象是函數(shù)內(nèi)部的本地變量究珊;arguments 已經(jīng)不再是函數(shù)的屬性了薪者。可以在函數(shù)內(nèi)部通過使用 arguments 對(duì)象來獲取函數(shù)的所有參數(shù)剿涮。這個(gè)對(duì)象為傳遞給函數(shù)的每個(gè)參數(shù)建立一個(gè)條目言津,條目的索引號(hào)從0開始攻人。它包括了函所要調(diào)用的參數(shù)。object對(duì)象悬槽、類數(shù)組怀吻。

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

在JS中,沒有重載初婆。同名函數(shù)會(huì)覆蓋蓬坡。但可以在函數(shù)體針對(duì)不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯。

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

作用: 隔離作用域屑咳。
??因?yàn)镴avaScript有很多致命缺陷,以致于各類淫才們開發(fā)出各種奇技淫巧來補(bǔ)JavaScript設(shè)計(jì)和歷史遺留問題上的坑弊琴。
比如JavaScript中沒有命名空間兆龙,而且只有function代碼塊內(nèi)部可以隔離變量作用域,自調(diào)用匿名函數(shù)就用來防止變量彌散到全局敲董,以免各種js庫沖突紫皇。

求n!,用遞歸來實(shí)現(xiàn)

function multiply(n){
    if(n===1){
        return 1;
    }
    return n*multiply(n-1);
}
multiply(4);

以下代碼輸出什么腋寨?

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
sex: undefined
["小谷", 3]
 name valley*/

getInfo('男');
/*name: 男
 age: undefined
sex: undefined
 ["男"]
name valley*/

寫一個(gè)函數(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(result)  //10

如下代碼的輸出萄窜?為什么

console.log(a);
    var a = 1;
    console.log(b);//b is not defined铃剔,沒有b變量的聲明

如下代碼的輸出?為什么

sayName('world');//hello world函數(shù)聲明前置
    sayAge(10);//報(bào)錯(cuò)脂倦,函數(shù)表達(dá)式不會(huì)前置番宁。
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };

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

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
*/

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

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
*/  

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

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*/

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

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茎截,隨后出現(xiàn)的幾起案子苇侵,更是在濱河造成了極大的恐慌,老刑警劉巖企锌,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榆浓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撕攒,警方通過查閱死者的電腦和手機(jī)陡鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門烘浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍鲸,你說我怎么就攤上這事闷叉。” “怎么了脊阴?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵握侧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嘿期,道長(zhǎng)品擎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任备徐,我火速辦了婚禮孽查,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坦喘。我一直安慰自己盲再,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布瓣铣。 她就那樣靜靜地躺著答朋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠笑。 梳的紋絲不亂的頭發(fā)上梦碗,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音蓖救,去河邊找鬼洪规。 笑死,一個(gè)胖子當(dāng)著我的面吹牛循捺,可吹牛的內(nèi)容都是我干的斩例。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼从橘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼念赶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恰力,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤叉谜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后踩萎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停局,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了董栽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片码倦。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裆泳,靈堂內(nèi)的尸體忽然破棺而出叹洲,到底是詐尸還是另有隱情,我是刑警寧澤工禾,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布运提,位于F島的核電站,受9級(jí)特大地震影響闻葵,放射性物質(zhì)發(fā)生泄漏民泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一槽畔、第九天 我趴在偏房一處隱蔽的房頂上張望栈妆。 院中可真熱鬧,春花似錦厢钧、人聲如沸鳞尔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寥假。三九已至,卻和暖如春霞扬,著一層夾襖步出監(jiān)牢的瞬間糕韧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工喻圃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萤彩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓斧拍,卻偏偏與公主長(zhǎng)得像雀扶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饮焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)就是一段可以反復(fù)調(diào)用的代碼塊怕吴。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會(huì)返回不同...
    徐國(guó)軍_plus閱讀 473評(píng)論 0 0
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明語法:function functionName(arg0,arg1,ar...
    _Dot912閱讀 571評(píng)論 0 3
  • 聲明前置和作用域也是JS 部分面試诚靥撸考點(diǎn) 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明:使用function關(guān)鍵字...
    湖衣閱讀 198評(píng)論 0 0
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別? 函數(shù)聲明和函數(shù)表達(dá)式是EMACScript規(guī)定的兩種不同的聲明函數(shù)的方法伟件。1.函...
    LeeoZz閱讀 347評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 function命令聲明的代碼區(qū)塊硼啤,就是一個(gè)函數(shù)。function命令后面是函...
    饑人谷_Leon閱讀 282評(píng)論 0 0