JavaScript 函數(shù)

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

  • 函數(shù)聲明:使用function關(guān)鍵字聲明一個(gè)函數(shù)
  • 函數(shù)表達(dá)式:聲明一個(gè)變量然后賦值為函數(shù)
  • **
  • 修改補(bǔ)充:
  • 函數(shù)聲明有聲明前置的作用,而函數(shù)表達(dá)式的賦值不能前置

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

  • 變量的聲明前置:JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運(yùn)行。這造成的結(jié)果,就是所有的變量的聲明語(yǔ)句,都會(huì)被提升到代碼的頭部,這就叫做變量提升
  • 函數(shù)的聲明前置:如果使用函數(shù)聲明來(lái)定義一個(gè)函數(shù),那么函數(shù)聲明會(huì)被提升到代碼最前面運(yùn)行

arguments 是什么

  • 函數(shù)中傳入?yún)?shù)的數(shù)組,默認(rèn)就有
  • **
  • 修改補(bǔ)充:
  • arguments并不是數(shù)組,而是類數(shù)組對(duì)象

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

  • JS中不支持定義參數(shù)不同的同名函數(shù),但是JS中函數(shù)調(diào)用沒(méi)必要把所有參數(shù)都傳入,傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)
  • **
  • 修改補(bǔ)充:
  • JS中同名函數(shù)會(huì)被覆蓋,JS重載示例如下:


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

(function(){
})();

作用:先創(chuàng)建一個(gè)匿名函數(shù),然后調(diào)用它,一般不定義函數(shù)名,除非需要遞歸調(diào)用

什么是函數(shù)的作用域鏈

在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。
在JavaScript中,函數(shù)也是對(duì)象,實(shí)際上,JavaScript里一切都是對(duì)象。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過(guò)代碼訪問(wèn)的屬性和一系列僅供JavaScript引擎訪問(wèn)的內(nèi)部屬性。其中一個(gè)內(nèi)部屬性是[[Scope]],該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合,這個(gè)集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問(wèn)。

  • **
  • 示例:
  • a為全局變量,可以被fn1和fn2訪問(wèn),b為fn1的局部變量,可以被fn1和內(nèi)部的fn2訪問(wèn),c為fn2的局部變量,只能被fn2訪問(wèn)


代碼題

  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('hunger', 28, '男');
    getInfo('hunger', 28);
    getInfo('男');

輸出

name: hunger
age: 28
sex: 男
["hunger", 28, "男"]
name valley
name: hunger
age: 28
sex: undefined
["hunger", 28]
name valley
name: 男
age: undefined
sex: undefined
["男"]
name valley
  1. 寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和?如
function sumOfSquares(){
   }
   sumOfSquares(2,3,4);   // 29
   sumOfSquares(1,3);   // 10

函數(shù):

function sumOfSquares(){
      var sum=0;
      for(var i=0;i<arguments.length;i++){
        sum+=arguments[i]*arguments[i];
      }
      console.log(sum);
    }
  1. 如下代碼的輸出?為什么
console.log(a);
var a = 1;
console.log(b);

輸出:
undefined和報(bào)錯(cuò):var a;被提升,但是賦值在console.log后,而 b 未定義。

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

輸出:
hello world 和報(bào)錯(cuò):使用函數(shù)聲明定義的函數(shù)被提升,而使用函數(shù)表達(dá)式定義的函數(shù)只提升定義聲明var = sayAge;

  1. 如下代碼的輸出?為什么
function fn(){} 
var fn = 3; 
console.log(fn);

輸出:
3:var fn;在函數(shù)聲明之前,但是fn = 3;在函數(shù)聲明之后

  1. 如下代碼的輸出?為什么
function fn(fn2){ 
   console.log(fn2); 
  var fn2 = 3; 
  console.log(fn2); 
  console.log(fn);
  function fn2(){ 
    console.log('fnnn2'); 
  }
}
fn(10);

輸出:

function fn2(){ 
    console.log('fnnn2'); 
  }
3
function fn(fn2){ 
  console.log(fn2); 
  var fn2 = 3; 
  console.log(fn2); 
  console.log(fn);
  function fn2(){ 
    console.log('fnnn2'); 
  }
}

原因:函數(shù)內(nèi)部執(zhí)行順序是

var fn2;
console.log(fn2);
fn2 = 3;
console.log(fn2);
console.log(fn);
  1. 如下代碼的輸出?為什么
var fn = 1; 
  function fn(fn){ 
  console.log(fn); 
} 
console.log(fn(fn));

結(jié)果:
報(bào)錯(cuò):fn = 1;覆蓋函數(shù)聲明

  1. 如下代碼的輸出?為什么
console.log(j); 
console.log(i); 
for(var i=0; i<10; i++){ 
  var j = 100; 
} 
console.log(i); 
console.log(j);

輸出:

undefined
undefined
10
100

原因:for語(yǔ)句是流程控制語(yǔ)句,不是函數(shù),不會(huì)產(chǎn)生新的作用域,其內(nèi)定義的變量是會(huì)發(fā)生變量提升的

  1. 如下代碼的輸出?為什么
fn(); 
var i = 10; 
var fn = 20; 
console.log(i); 
function fn(){ 
  console.log(i); 
  var i = 99; 
  fn2(); 
  console.log(i); 
  function fn2(){ 
    i = 100; 
  } 
}

輸出

undefined
100
10

原因:先執(zhí)行函數(shù) fn();其內(nèi)第一次log時(shí),i 未賦值,第二次log時(shí)之前執(zhí)行了 fn2();i 被賦值為100;然后第三次log時(shí),i 被賦值為10;

  1. 如下代碼的輸出?為什么
var say = 0; 
(function say(n){ 
  console.log(n); 
  if(n<3) 
    return; 
  say(n-1); 
}( 10 )); 
console.log(say);

輸出

10
9
8
7
6
5
4
3
2
0

原因:立即執(zhí)行函數(shù)內(nèi)部發(fā)生遞歸,從10開(kāi)始,直到n = 2時(shí),return;n = 2是函數(shù)內(nèi)最后一個(gè)打印的,然后跳出函數(shù)體,執(zhí)行console.log(say); say = 0;

本教程版權(quán)歸饑人谷和作者所有,轉(zhuǎn)載須說(shuō)明來(lái)源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可以訪問(wèn);函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 446評(píng)論 0 1
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 8,118評(píng)論 2 17
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行,但...
    Sheldon_Yee閱讀 469評(píng)論 0 1
  • 依山傍水
    麥子dee5閱讀 288評(píng)論 2 1
  • 虞哥閱讀 141評(píng)論 0 0

友情鏈接更多精彩內(nèi)容