(function (a){
return function(){alert(a)}
})(1)将以上代码写成:function (a){
return function(){alert(a)}
}(1)是不正确的
但是function c(a,fn){fn()}
c(1,function (a){
return function(){alert(a)}
}(1));作为参数的那个匿名函数外面的括号加不加都能正常运行,这是为什么呢??

解决方案 »

  1.   

    (function (a){
    return function(){alert(a)}
    })(1)
    a=function (a){
    return function(){alert(a)}
    }(1);
    function c(a,fn){fn()}
    c(1,a);
      

  2.   

    (function (a){
    return function(){alert(a)}
    })(1)这样写是表示定义一个匿名函数并且传入参数1,立即执行。。
      

  3.   

    ()在js中是强制表达式运算(function (a){
    return function(){alert(a)}
    })(1)
    不用()括着的话,引擎不知道你要强制运算他
    其他它等同于
    (function (a){
    return function(){alert(a)}
    }(1))所以就可以理解function c(a,fn){fn()}
    c(1,function (a){
    return function(){alert(a)}
    }(1));
    为什么是正确了
      

  4.   

    c(1,function (a){
    return function(){alert(a)}
    }(1));
    里面的
    function (a){
    return function(){alert(a)}
    }(1)
    不是也需要执行而返回function(){alert(a)}吗?
      

  5.   


    你的意思是
    function c(a,fn){fn()}
    c(1,function (a){
    return function(){alert(a)}
    }(1));
    为什么能执行alert(a)?
      

  6.   

    function c(a,fn){fn()}
    c(1,function (a){
    return function(){alert(a)}
    }(1));我们一步一步看function (a){
    return function(){alert(a)}
    }(1)
    等同于function(){alert(1)}所以
    c(1,function (a){
    return function(){alert(a)}
    }(1)); ==
    c(1,function (){
    alert(1)
    });
    再看c函数
    function c(a,fn){fn()} 
    它方法体里把fn执行了fn();
    所以就等于把function (){
    alert(1)
    }执行了,不就会alert(1)了?