函數(shù)

問(wèn)答

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

    函數(shù)聲明用指定的參數(shù)聲明一個(gè)函數(shù),必須有函數(shù)名稱,可在函數(shù)聲明之前使用函數(shù) 函數(shù)表達(dá)式可省略函數(shù)名稱創(chuàng)建匿名函數(shù)

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

    javascript的變量聲明具有hoisting機(jī)制,JavaScript引擎在執(zhí)行的時(shí)候,會(huì)把所有變量的聲明都提升到當(dāng)前作用域的最前面,但是并未進(jìn)行下面的判斷,所以未賦值。 函數(shù)的聲明前置是指將整個(gè)被定義的函數(shù)提升,此時(shí)這個(gè)函數(shù)是有意義的,可以被調(diào)用的。

  3. arguments是什么?

    arguments對(duì)象不能顯式創(chuàng)建,arguments對(duì)象只有函數(shù)開(kāi)始時(shí)才可用。獲得該函數(shù)所有傳入?yún)?shù)。

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

    重載是很多面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)多態(tài)的手段之一,在靜態(tài)語(yǔ)言中確定一個(gè)函數(shù)的手段是靠方法簽名----函數(shù)名+參數(shù)列表,也就是說(shuō)相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù),稱為函數(shù)重載 在JavaScript中,函數(shù)調(diào)用沒(méi)必要把所有參數(shù)都傳入,只要你函數(shù)體內(nèi)做好處理就行,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)

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

立即執(zhí)行函數(shù)常用寫(xiě)法
(function(){ /* code */ }())
(function(){ /* code */ })()

作用

  1. 隔離作用域

  2. 省下執(zhí)行語(yǔ)句

  3. 省略函數(shù)名臣以冥函數(shù)執(zhí)行

  4. 什么是函數(shù)的作用域鏈? 在大多數(shù)語(yǔ)言中都是用花括號(hào){}來(lái)形成一個(gè)作用域,俗稱塊作用域,avaScript的作用域是靠函數(shù)來(lái)形成的,也就是說(shuō)一個(gè)函數(shù)內(nèi)定義的變量函數(shù)外不可以訪問(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, '男');
    /*name:huanger
    age:28
    sex:男
    arguments[3]
    name valley */
  getInfo('hunger', 28);
    /* name:huanger
    age:28
    sex:undefined
    arguments[2]
    name valley */
  getInfo('男');
    /* name:huanger
    age:undefined
    sex:undefined
    arguments[1]
    name valley */
  1. 寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和?
    function sumOfSquares() {}
    sumOfSquares(2, 3, 4); // 29
    sumOfSquares(1, 3); // 10

    function sumOfSquares() {
        var sumOfSquares = 0;
        for (var i = 0; i < arguments.length; i++) {
            sumOfSquares = sumOfSquares + arguments[i] * arguments[i];
        }
        return sumOfSquares
    }
    console.log(sumOfSquares(2, 3, 4));
    console.log(sumOfSquares(1, 3));
  1. 如下代碼的輸出?為什么
  console.log(a);
  // undefined 聲明前置,但是沒(méi)有賦值;
  var a = 1;
  console.log(b);
  // b is not defined 沒(méi)有聲明;
  1. 如下代碼的輸出?為什么
  sayName('world');
  sayAge(10);

  function sayName(name) {
      console.log('hello ', name); // hello world,
  }
  var sayAge = function(age) {
      console.log(age); // sayAge is not a function,
  };

  /* 函數(shù)sayName提前,執(zhí)行sayName('world'), 
  執(zhí)行sayAge(10), 因?yàn)関ar sayAge = function(age) {console.log(age);}
  為函數(shù)表達(dá)式,作為一個(gè)變量, 因此sayAge函數(shù)未聲明。*/
  1. 如下代碼的輸出?為什么
  function fn() {}
  var fn = 3;
  console.log(fn); //3

  // console.log(fn)打印fn,var fn=3;對(duì)fn進(jìn)行聲明且賦值為3
  1. 如下代碼的輸出?為什么
  function fn(fn2) {
      console.log(fn2);
      var fn2 = 3;
      console.log(fn2);
      console.log(fn);

      function fn2() {
          console.log('fnnn2');
      }
  }
  fn(10);

  轉(zhuǎn)換為

  function fn(fn2) {
      var fn2;

      function fn2() {
          console.log('fnnn2');
      }
      console.log(fn2); // 打印函數(shù)fn2
      var fn2 = 3;
      console.log(fn2); // 3
      console.log(fn); // 打印函數(shù)fn
  }
  1. 如下代碼的輸出?為什么
  var fn = 1;

  function fn(fn) {
      console.log(fn);
  }
  console.log(fn(fn)); // fn is not a function

  聲明前置轉(zhuǎn)換為
  var fn;
  function fn(fn) {
      console.log(fn);
  }
  fn = 1;
  console.log(fn(fn)); //故fn不是函數(shù),報(bào)錯(cuò)
  1. 如下代碼的輸出?為什么
  console.log(j); //underfined,未定義
  console.log(i); //underfined,未定義
  for (var i = 0; i < 10; i++) {
      var j = 100;
  }
  console.log(i); // 10
  console.log(j); // 100

  /* 因?yàn)閒or循環(huán)中var i=0,var j=100定義且賦值了i,j,
  且在執(zhí)行這個(gè)賦值語(yǔ)句的時(shí)候,會(huì)沿著作用域鏈尋找名字叫做i,j的變量,
  一直找到作用域鏈的頂端還沒(méi)有找到,于是給window添加一個(gè)屬性i,j然后賦值。 */
  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;
      }
  }
  // 聲明前置后
  var i;
  var fn;

  function fn() {
      var i;

      function fn2() {
          i = 100;
      }
      console.log(i); //underfined,未賦值
      i = 99;
      fn2();
      console.log(i); //100, 執(zhí)行function fn2(){ i = 100; }后
  }
  fn();
  var i = 10;
  var fn = 20;
  console.log(i); //10, var i=10賦值
  1. 如下代碼的輸出?為什么
  var say = 0;
  (function say(n) {
      console.log(n);
      if (n < 3) return;
      say(n - 1);
  }(10));
  console.log(say);

  轉(zhuǎn)換后
  var say;

  function say(n) {
      console.log(n);
      if (n < 3) return;
      say(n - 1);
  }(10);
  (function say(n) {
      console.log(n);
      if (n < 3) return;
      say(n - 1);
  }(10));
  var say = 0;
  console.log(say);
  // 10 9 8 7 6 5 4 3 2 0
  /* 函數(shù)function say() {}
  立即執(zhí)行當(dāng)n < 3 停止并返回?cái)?shù)據(jù), 根據(jù)函數(shù)打印10 9 8 7 6 5 4 3 2
  var say = 0 賦值, 打印say, 0。*/

本教程版權(quán)歸本人和饑人谷所有

最后編輯于
?著作權(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閱讀 445評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行,但...
    Sheldon_Yee閱讀 469評(píng)論 0 1
  • 1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別? 在變量提升或聲明提前過(guò)程中,函數(shù)聲明是將整個(gè)被定義的函數(shù)提前,即該函數(shù)可以...
    王康_Wang閱讀 403評(píng)論 0 0
  • 問(wèn)答題 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)答://函數(shù)聲明function hello(){ conso...
    饑人谷_桶飯閱讀 293評(píng)論 0 0
  • 從“硬粗多”到細(xì)軟少我只用了4年! 一點(diǎn)兒也不駭人聽(tīng)聞。 小時(shí)候扎頭發(fā)對(duì)我來(lái)說(shuō)就是惡夢(mèng),因?yàn)轭^發(fā)多,皮筋繞兩圈容易...
    cuigugua閱讀 2,263評(píng)論 5 55

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