使用框架的过程中,有时候需要根据自己的需求去改变源码,一般都是一个匿名函数开始,然后,就开始思考,匿名函数的作用了,通过在网上查找的资料,慢慢了解了匿名函数,以后开发自己想要的插件轮子时,就用的到了。
匿名函数定义
顾名思义,匿名函数就是没有实际名字的函数,比如一般长长的函数:
function a(x){
return x*x;
}
如果我们把名字去掉,判断一下是不是一个函数:
alert(typeof function(x){return x*x;});
结果显示是function对象。
匿名函数的调用
一般我们需要调用一个函数,需要通过函数的名字去指定调用那个函数,但是匿名函数没有名字,我们怎么调用呢? 常用的一种方式是去定义函数
var a=function(x){return x*x;}
alert(a(4));
对匿名函数的调用还有一种方法,就是我们在源码中看到的,用()将匿名函数括起来,然后后面再加一堆小括号(包含参数列表):
alert((function(x){return x*x;})(2));//4
alert((new Function('x','return x*x;'))(2));//4
那么小括号为啥会有这样的作用呢?小括号能把我们的表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值,这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用已对小括号把匿名函数括起来时,实际上小括号对返回的就是一个匿名函数的function对象,因此,小括号对加上匿名函数就如同有名字的函数般被我们取得它的位置,所以如果在这个引用变量后面机上参数列表,就会实现普通函数的调用方式。 比如:
var a=function(x,y){return x+y;};//把匿名函数对象赋给a
//a的constructor(构造函数)就和匿名函数的constructor一样了,就是说,这两个函数的实现是一样的
alert((a).constructor==(function(x,y){return x+y;}).constructor);
总之,将其(被小括号包含的匿名函数)理解为括号表达式返回的函数对象,然后就可以对这个函数对象作正常的参数列表调用了。(前面这里犯了个错 误,只有函数表达式还是不能直接调用函数的,去掉匿名函数括号必须要伴随将表达式赋值。也就是(function(){alert(1)})()应该是与 a=function(){alert(1)}()等价,不能连a=都去掉。)
匿名函数的写法
最常见的匿名函数的用法:
(function(){
alert("ss");
})();
带参的写法:
(function(x){
alert(x);
})('haha');
调用函数,得到返回值。强制运算符使函数调用执行:
(function(x,y){
alert(x+y);
return x+y;
}(3,4));
调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用再去调用执行:
(function(x,y){
alert(x+y);
return x+y;
})(3,4);
这种方式也是很多库爱用的调用方式,如jQuery,Mootools。
匿名函数的链式调用:
(function(x) {
alert(x);
return arguments.callee;
})('haha')('down');
使用void效率最高:
void function(){
alert("haha");
}();
使用-/+运算符:
-function(x,y){
alert(x+y);
return x+y;
}(3,4);
+function(x,y){
alert(x+y);
return x+y;
}(3,4);
--function(x,y){
alert(x+y);
return x+y;
}(3,4);
++function(x,y){
alert(x+y);
return x+y;
}(3,4);
使用波浪符(~):
~function(x, y) {
alert(x+y);
return x+y;
}(3, 4);
匿名函数执行放在中括号内:
[function(){
console.log(this) // 浏览器得控制台输出window
}(this)]
匿名函数前加typeof:
typeof function(){
console.log(this) // 浏览器得控制台输出window
}(this)
匿名函数前加delete:
delete function(){
console.log(this) // 浏览器得控制台输出window
}(this)
匿名函数前加void:
void function(){
console.log(this) // 浏览器得控制台输出window
}(this)
使用new方式,传参:
new function(win){
console.log(win) // window
}(this)
使用new,不传参:
new function(){
console.log(this) // 这里的this就不是window了
}
逗号运算符:
1, function(){
console.log(this) // window
}();
按位异或运算符:
1^function(){
console.log(this) // window
}();
比较运算符:
1>function(){
console.log(this) // window
}();