匿名与具名函数、函数声明与函数表达式、立即执行函数(已完结)
程序员文章站
2022-07-15 12:54:36
...
匿名与具名函数
这属于常识性问题,但是还是有必要说说
- 没有函数名的函数就叫匿名函数,有函数名的函数就叫具名函数
setInterval(function(){//匿名函数
...
},1000);
var funA = function(){//匿名函数表达式
...
}
var funB = function test(){
...
}
函数声明与函数表达式
- 函数声明与函数表达式的区分
区分函数声明和表达式最简单的方法是看function 关键字出现在声明中的位置(不仅仅是一行代码,而是整个声明中的位置)。如果function 是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式。
(function(){...}());//函数表达式
+function test(){...}//函数表达式
setInterval(function(){//function既不是函数声明也不是函数表达式,只是一个参数
...
},1000);
- 函数声明与函数表达式的差异
函数声明和函数表达式之间最重要的区别是它们的名称标识符将会绑定在何处
比较一下两个代码片段:
var a = 2;
function foo() {
var a = 3;
console.log( a ); // 3
}
foo();
console.log( a ); // 2
/*---------*/
(function foo(){
var a = 3;
console.log( a ); // 3
})();
console.log( a ); // 2
第一个片段中foo 被绑定在所在作用域中,可以直接通过foo() 来调用它。第二个片段中foo 被绑定在函数表达式自身的函数中而不是所在作用域中。
换句话说,(function foo(){ .. }) 作为函数表达式意味着foo 只能在.. 所代表的位置中被访问,外部作用域则不行。foo 变量名被隐藏在自身中意味着不会非必要地污染外部作用域。
立即执行函数—IIFE(Immediately Invoked Function Expression)
- 立即执行函数的原理探究
在‘JavaScript语言精粹——P(28)’中说到——调用函数时,调用运算符(即())是跟在任何产生一个函数值的表达式之后的一对圆括号(无论以何种方式调用函数,其实质都是这样的)。因此,你可能便会认为以下函数调用是合理的
function test(){
console.log('测试');
}();
/*当然,上述形式符合规定,但是却报错*/
这是因为上述不是函数表达式
你也可以这样去理解立即执行函数:只有表达式才会被执行,那么函数表达式当然也会被执行
ps:本文参考并引用下列书籍
《你不知道的JavaScript》(上卷)