题
当我编码:
var a =
function()
{
alert("44")
return function(){alert(33)}
}()();
是按以下顺序评估此表达式吗?
- 定义函数;
- 将其引用指针传递给
- a()被调用
- 返回一个新的函数指针
- 再次调用a() 醇>
如果是,如果我这样做,为什么会出现语法错误:
function()
{
alert("44")
return function(){alert(33)}
}();
解释器首先想要一个左操作数......
但这种语法有效:
(
function()
{
alert("44")
return function(){alert(33)}
};
)()
外括号是什么意思???
由于
解决方案
这是该语言的语法。如果要在就地执行匿名函数,则必须将其括在parens中。
JS有这些边缘情况,其语法比你期望的更怪异。举例来说,评估一个具有JSON的字符串不起作用,除非它用parens包装。
// Wrong
eval("{ ... }");
// Right
eval("({ ... })");
这是该语言的语法。
那就是说,我认为(这是严格意义上的恕我直言),你所概述的步骤并不准确。
- 定义并调用函数。警报(QUOT; 44&QUOT);结果发生了。
- 该函数返回另一个也被调用的函数。警报(QUOT; 33&QUOT);发生的情况。
- 最里面的函数不会返回任何内容,所以a实际上是未定义的。 typeof a return“undefined”。 醇>
其他提示
-
function(){alert(" 44")return function(){alert(33)}}
定义功能 -
function(){alert(" 44")return function(){alert(33)}}
()
你调用该函数返回匿名函数function(){alert(33)}
-
function(){alert(" 44")return function(){alert(33)}}()
()
你调用返回的函数,所以它实际上相当于function(){alert(33)}()
醇>
所以整个执行相当于:
alert("44"); alert(33);
我也在学习自我调用功能。
我认为代码应该是
3. (function(){alert(" 44"); return function(){alert(33);}})()()
不隶属于 StackOverflow