匿名函数:
写法1:
function(){
console.log(1);
}
// 报错,不能直接使用
解析:1.因为ECAMScript规定的声明必须有名字,如果没有名字的话,就没有办法找到他
2.如果没有名字,必须有一个依附体,如:将整个匿名函数赋值给一个变量
写法2:
var a=function(){
console.log(1);
}
a();
//匿名函数可以依附于一个变量,并且这个变量名就是这个匿名函数的名字
var a=function(){
console.log(typeof,a);
// 打印: function
写法3:
window.οnlοad=function(){
console.log('匿名函数');
}
//打印:匿名函数,当匿名函数用在绑定事件中的时候,这个事件执行的时候这个匿名函数也会被执行
写法4:
(function(){
console.log('匿名函数');
})()
//打印:匿名函数,如果将匿名函数放入表达式中并且后面加上小括号会自动执行此函数
解析:1.此函数可以执行是因为我们将这个函数包含在一个小括号内(神奇的小括号)
2.按照ECMAScript的规定,函数声明是必须有名字的,但是我们用括号括起来后这个函数就不再是一个函数声明了
而是一个表达式,可以理解为如下代码:
var a=function(){
console.log('匿名函数');
}();
3.将一个匿名函数赋值给一个变量或者对象属性就是函数表达式,函数表达式是可以不需要名字的,所以就可以直接通过这种方式来自动的执行函数
总结:也就是说,只要是表达式就可以执行它,并不需要函数名,那么也可以这样调用:
-function(){ ... }()
+function(){ ... }()
~function(){ ... }()
!function(){ ... }()
&function(){ ... }()
|function(){ ... }()
/function(){ ... }()
%function(){ ... }()
typeof function(){ ... }()
null==function(){ ... }()
0==function(){ ... }()
0!=function(){ ... }()
0>function(){ ... }()
0<function(){ ... }()
0-function(){ ... }()
写法5:
var a=function(){
console.log('匿名函数');
}()
//打印:匿名函数,匿名函数后面加括号会执行这个函数
写法6:
function (){
console.log('匿名函数');
} ();
//打印:报错,匿名函数必须依附一个变量
写法7:
var a=function(){
fn:function(){
console.log(1);
}
}
a.fn();
//打印:1,匿名函数不只是可以依附于一个变量,也可以依附于一个对象的属性
写法8:
var a={
fn:function(){
console.log('匿名函数');
}()
}
//打印: 匿名函数,同样匿名函数当做一个对象的属性时也可以自调用
写法9:
var a=function(b){
console.log(b);
}
a(9);
//打印:9,匿名函数也可以传递参数
写法10:
(function(a){
console.log(a);
})(10)
//打印:10,对于表达式函数同样也可以传递参数
写法11:
var a=function(b){
console.log(b);
}(11)
console.log(a);
//打印:第一个为11,第二个为undefined;如果将一个自执行的匿名函数并且没有返回值,赋值给一个变量那么这个变量的值就是undefined
因为这个函数在赋值之前已经执行完了,而这个函数没有返回值,所以就是undefined
如果有返回值,那么这个变量的值就是那个匿名函数的返回值
var a=function(b){
return b
}(10);
console.log(a);
//打印:10,有返回值,所以这个变量的值就是这个匿名函数的返回值