2009-03-03 47 views
4

当我代码:自我调用功能

var a = 
function() 
{ 
    alert("44") 
    return function(){alert(33)} 
}()(); 

是这种表达按照以下顺序进行评价?

  1. 定义函数;
  2. 通过其参考指针
  3. 一个()被调用在迈上了一个新的函数指针
  4. 一个()被再次调用

如果是这样,为什么我有一个语法

  • 回报错误,如果我做的:

    function() 
    { 
        alert("44") 
        return function(){alert(33)} 
    }(); 
    

    翻译首先要左操作数...

    但是这句法作品:

    (
        function() 
        { 
        alert("44") 
        return function(){alert(33)} 
        }; 
    
    )() 
    

    外括号什么呢???意义

    感谢

  • 回答

    3

    这是语言的语法。如果你想就地执行一个匿名函数,你必须把它放在parens中。

    JS有这些边缘情况下,语法比你想象的更为奇怪。举个例子,除非用parens包装,否则评估具有JSON的字符串不起作用。

    // Wrong 
    eval("{ ... }"); 
    // Right 
    eval("({ ... })"); 
    

    这是语言的语法。

    这就是说,我认为(这是严格的恕我直言),你列出的步骤是不准确的。

    1. 函数被定义和调用。警报( “44”);作为结果发生。
    2. 该函数返回另一个也被调用的函数。警报( “33”);发生。
    3. 最内层的函数不返回任何东西,所以a实际上是未定义的。 typeof a returns“undefined”。
    3
    1. function() { alert("44") return function(){alert(33)} } 您定义的功能
    2. function() { alert("44") return function(){alert(33)} }() 你调用该函数返回匿名函数function(){alert(33)}
    3. function() { alert("44") return function(){alert(33)} }()() 你调用返回的功能,所以它实际上是等同于function(){alert(33)}()

    所以整个执行等同于:

    alert("44"); alert(33); 
    
    0

    我刚学习自调用函数。
    我想代码应该是 3. (function() { alert("44"); return function(){alert(33);} })()()