首頁  >  問答  >  主體

javascript - 關於函數閉包、函數作為參數傳遞疑問

1.描述:

我想要得到一個函數數組 result ,首先func函數在數組result中添加匿名函數(每個匿名函數都保存了各自的num)

但是我將return 後面的匿名函數我用參數傳進來,相當於只是做了替換而已,為什麼結果卻不同呢。

function func(){
  var result =[] ;
  for(var i=0;i<3;i++){
    result.push(
      function (num){
        return function (){
          return num
        }      
      }(i)
    )
  }
 return result
}

console.log(func()[1]())  //这样我就能得到各自函数里的num

下面我將 return 後面匿名函數傳進去當作參數就取得不到。

function func(fn){
  var result =[] ;
  for(var i=0;i<3;i++){
    result.push(
      function (num){
        return fn;     
      }(i)
    )
  }
 return result
}

function fn(){
  return num
}
console.log(func(fn)[1]()) //报错提示num未定义
  
世界只因有你世界只因有你2692 天前771

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-06-26 10:52:31

    因為第二段程式碼中的fn是定義在全域環境中的。
    你可以看看這裡和下邊的程式碼,希望對你有幫助

    function func(fn){
      var result =[] ;
      for(var i=0;i<3;i++){
        result.push(
          function (num){
            return fn;     
          }(i)
        );
      }
     return result;
    }
    
    function fn(){
      return num;
    }
    var num = 1;
    console.log(func(fn)[1]()); //1

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-06-26 10:52:31

    這是一個很簡單的作用域的問題,你的循環中定義的函數的形參只在這個函數中起作用。

    函數是不應該在循環或判斷條件下定義的,會發生很多意想不到的問題。把你的函數拿出來定義,你會發現邏輯也清楚了許多。

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-26 10:52:31

    num作用域問題,javascript存在函數作用域,num在第一個函數內部,而第二個函數在第一個函數外部,則第二個函數無法取得num.

    回覆
    0
  • 取消回覆