写法一:
function f() {  
  var a = [];  
  var i;  
  for(i = 0; i < 3; i++) {  
    a[i] = (function(i){  
      return function(){  
        alert(i);  
        return i;  
      }  
    })();  
  }  
  return a;  
}  
  
var a = f();  
a[0]();//undefined  
a[1]();//undefined  
a[2]();//undefined  上面这种匿名函数的写法,正确吗?我觉得与下面的写法没有区别啊?
写法二 和 写法三 只差别在有无  ( ) 上,没括号的是正确写法吗?
写法二:function f() {  
  var a = [];  
  var i;  
  for(i = 0; i < 3; i++) {  
    a[i] = (function(x){  
      return function(){  
        alert(x);  
        return x;  
      }  
    })(i);  
  }  
  return a;  
}  
  
var a = f();  
a[0]();//0 
a[1]();//1 
a[2]();//2  
写法三:function f() {  
  var a = [];  
  var i;  
  for(i = 0; i < 3; i++) {  
    a[i] = function(x){  
      return function(){  
        alert(x);  
        return x;  
      }  
    }(i);  
  }  
  return a;  
}  
  
var a = f();  
a[0]();//0 
a[1]();//1 
a[2]();//2  

解决方案 »

  1. 错误原因不在于括号,因为你的第一个函数没有传参数进去,所以都是undefined 
      

  2. 谢谢指教。a[i] = (function(i){  
          return function(){  
            alert(i);  
            return i;  
          }  
        })();  
    我以为在定义中写一下 i ,参数就自动传进去了呢!
      

  3. 顺利通过语法编译期, 比如
    var a = function (){
       
    }()  可以function a(){}()和function(){
    }()都不可以.周爱民的书讲的很详细,想真正搞懂js,推荐人手一册 :)
      

  4. var a = function (){ 
      
    }()
    引擎分析为 var a = function(){}; //--第一步
              a();  //--第二步
    function a(){ }()
    分析为 function a(){};  //--第一步
           () //--第二步, 语法错误!!所以要让编译通过, 只要把匿名函数作为表达式申明就可以了.比如~function(){}()  // ~function(){}为一个对匿名函数返回值取反减一的表达式 第一次回这么多哈!
      

类似问题 »