将函数语句转换为函数表达式的方法

时间:2014-05-03 23:54:31

标签: javascript

我一直在研究IIFE(即时调用函数表达式)并理解一般模式及其工作原理:

(function boo(y) {
  alert(y);
})(2); // call, not a grouping operator, 2

在这种情况下:

function body(y){
  alert(y);
}(2);

(2)只是一个分组运算符,它与调用函数语句无关,它与:

function body(y) {
  alert(y);
}

(2);

我不明白这两个函数如何创建函数表达式而不是函数语句:

2, function () {
  alert('anonymous function);
}();

// OR 

!function () {
  alert('Hello World');
}();

这两个函数如何充当表达式?我可以看到它们是匿名函数,但我不明白它们是如何表达的?为什么它们被执行而不是抛出某种形式的语法错误?

1 个答案:

答案 0 :(得分:2)

首先,没有一个例子被称为“函数语句”。这是Mozilla唯一的语法区别,看起来像一个函数声明,但出现在语句块中。

  

在这种情况下:

function body(y){
  alert(y);
}(2);
     

(2)只是一个分组操作符,它与调用无关   功能声明......

是的,(2)将是一个分组运算符,因为函数声明已被提升,因此(2)并未真正遵循它。

  

......它与:

相同
function body(y) {
 alert(y);
}

(2);

是的,空格被忽略。

  

我不明白这两个函数如何创建函数表达式而不是函数语句:

2, function () {
 alert('anonymous function);
}();
     

// OR

!function () {
 alert('Hello World');
}();

它们是一个表达式,因为存在需要操作数表达式的运算符。因此,该函数成为操作数,因此被评估为所需的表达式。

所以仅仅是当程序被解析并遇到例如!时,它知道下一步必须是一个表达式,所以当它评估它之后的function () {...时,它将其视为一个有效的表达式,因此将其解释为。