搜索

首页  >  问答  >  正文

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未定义
  
世界只因有你世界只因有你2739 天前832

全部回复(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
  • 取消回复