当我编码:

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

是按以下顺序评估此表达式吗?

  1. 定义函数;
  2. 将其引用指针传递给
  3. a()被调用
  4. 返回一个新的函数指针
  5. 再次调用a()
  6. 如果是,如果我这样做,为什么会出现语法错误:

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

    解释器首先想要一个左操作数......

    但这种语法有效:

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

    外括号是什么意思???

    由于

有帮助吗?

解决方案

这是该语言的语法。如果要在就地执行匿名函数,则必须将其括在parens中。

JS有这些边缘情况,其语法比你期望的更怪异。举例来说,评估一个具有JSON的字符串不起作用,除非它用parens包装。

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

这是该语言的语法。

那就是说,我认为(这是严格意义上的恕我直言),你所概述的步骤并不准确。

  1. 定义并调用函数。警报(QUOT; 44&QUOT);结果发生了。
  2. 该函数返回另一个也被调用的函数。警报(QUOT; 33&QUOT);发生的情况。
  3. 最里面的函数不会返回任何内容,所以a实际上是未定义的。 typeof a return“undefined”。

其他提示

  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)}()
  4. 所以整个执行相当于:

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

我也在学习自我调用功能。
我认为代码应该是 3. (function(){alert(" 44"); return function(){alert(33);}})()()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top