js学习

使用框架的过程中,有时候需要根据自己的需求去改变源码,一般都是一个匿名函数开始,然后,就开始思考,匿名函数的作用了,通过在网上查找的资料,慢慢了解了匿名函数,以后开发自己想要的插件轮子时,就用的到了。

匿名函数定义

顾名思义,匿名函数就是没有实际名字的函数,比如一般长长的函数:

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
}();