Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匿名函数、声明和表达式语法理解_Javascript - Fatal编程技术网

Javascript 匿名函数、声明和表达式语法理解

Javascript 匿名函数、声明和表达式语法理解,javascript,Javascript,有人能帮我理解这个代码吗?为什么匿名函数在括号内 (function(food) { if (food === "cookies") { alert("More please"); } else if (food === "cake") { alert("Yum yum"); } })("cookies"); 如果我在这样的变量中引用函数并去掉括号,我可以理解函数是通过cookies字符串调用的 v

有人能帮我理解这个代码吗?为什么
匿名函数
在括号内

(function(food) {    
     if (food === "cookies") {        
         alert("More please");
     } else if (food === "cake") {
         alert("Yum yum");
     } 
 })("cookies");
如果我在这样的变量中引用函数并去掉括号,我可以理解函数是通过
cookies
字符串调用的

 var foodFunc = function(food) {    
     if (food === "cookies") {        
         alert("More please");
     } else if (food === "cake") {
         alert("Yum yum");
     } 
 }

foodFunc("cookies");

你为什么要用第一个例子?为什么要将匿名函数放在括号内?

匿名函数必须放在括号内,以便可以立即调用它。编写
函数(){…}()
是行不通的。如果您只需要一次匿名函数,那么使用匿名函数是有意义的,这里可能就是这种情况。

匿名函数必须位于括号内,以便可以立即调用它。编写
函数(){…}()
是行不通的。如果您只需要一次匿名函数,那么使用匿名函数是有意义的,这里很可能就是这种情况。

这里值得注意的是:

    var food = function(food) {    
     if (food === "cookies") {        
         alert("More please");
     } else if (food === "cake") {
         alert("Yum yum");
     } 
}("cookies");
也不需要额外的(),并将foo作为调用的结果-在本例中为未定义,因为函数不返回任何内容-

这是因为这是声明函数的本机javascript语法

但是,当javascript编译器发现如下声明时:

function foo(){
    return 'bar';
}
它将其转换为:

var foo = function(){ return 'bar'; };
(还可以做一些提升)

但如果你想声明一个类似的:

那么编译器就不能将其分配给变量

你可以做:

function res(){
    console.log('res')
}()
并且期望res在执行时被声明为一个函数,并被附加到窗口中。但这通常不是IIFE所希望的行为,因此您必须添加额外的()命令编译器不要将res保存为函数。因为,如果您希望res同时被声明和调用,那么您只需要声明一个res函数,然后调用它。IIFE并不打算声明函数,但是

function someFunc(){...}

告诉编译器将someFunc声明为具有已定义函数值的var,您需要额外的语法来防止IIFE声明变量

这里值得注意的是:

    var food = function(food) {    
     if (food === "cookies") {        
         alert("More please");
     } else if (food === "cake") {
         alert("Yum yum");
     } 
}("cookies");
也不需要额外的(),并将foo作为调用的结果-在本例中为未定义,因为函数不返回任何内容-

这是因为这是声明函数的本机javascript语法

但是,当javascript编译器发现如下声明时:

function foo(){
    return 'bar';
}
它将其转换为:

var foo = function(){ return 'bar'; };
(还可以做一些提升)

但如果你想声明一个类似的:

那么编译器就不能将其分配给变量

你可以做:

function res(){
    console.log('res')
}()
并且期望res在执行时被声明为一个函数,并被附加到窗口中。但这通常不是IIFE所希望的行为,因此您必须添加额外的()命令编译器不要将res保存为函数。因为,如果您希望res同时被声明和调用,那么您只需要声明一个res函数,然后调用它。IIFE并不打算声明函数,但是

function someFunc(){...}

告诉编译器将someFunc声明为具有已定义函数值的var,您需要额外的语法来防止IIFE声明变量

在许多情况下,您可以使用IIFEs。以下是一个这样的案例:

在循环中添加事件侦听器:

输出不正确:

var els=document.getElementsByClassName(“内容”);
对于(变量i=0;i
.content{
高度:50px;
宽度:50px;
边框:1px纯色灰色;
线高:50px;
文本对齐:居中
}
1
2.
3.
4.

5
在许多情况下,您可以使用IIFE。以下是一个这样的案例:

在循环中添加事件侦听器:

输出不正确:

var els=document.getElementsByClassName(“内容”);
对于(变量i=0;i
.content{
高度:50px;
宽度:50px;
边框:1px纯色灰色;
线高:50px;
文本对齐:居中
}
1
2.
3.
4.

5
Its称为IIFE(立即调用函数执行)。它用于需要立即执行但之后又不需要执行的功能您是否面临任何需要解决的问题?请坚持这一点。它可能被称为IIFE(立即调用的函数执行)的副本。它用于需要立即执行但之后又不需要执行的功能您是否面临任何需要解决的问题?请坚持这一点。可能是重复的