日期:2014-05-16 浏览次数:20346 次
?
????? 除了基本的脚本语言的函数使用,JavaScript的函数还有其它几种特殊的用法,总结一下有以下几种:
?
自调用匿名函数
?
???? 先来看一个例子:
?
(function(){ alert("blessdyb"); })();
?
??? 虽然看起来比较恐怖,但思路很简单。我们将一个匿名函数放在一对括号中,同时这对括号后面也有另一对表示执行前面括号中匿名函数的括号。当然,第二个括号的也可以用来进行参数传递。如下面的代码实现和上面相同的功能:
?
?
(function(x){ alert(x); })("blessdyb");
?
?
??? 使用这种函数的好处就是我们可以省去建立一些全局变量,但同时也能实现很多工作。当然,如果我们不想一些函数被调用多次,也可以通过这样的方式来实现。这种方式最适合那些只执行一次的工作或者初始化类的工作。
?
内部(私有)函数
??? 在JavaScript中,函数可以看做是一种特殊形式的数据。所以我们就可以考虑在函数中来定义函数。同时考虑到JavaScript中的变量作用域是以函数为单位来划分的,所以我们在函数内部定义的函数就变成了私有的函数。如下:
?
?
function outFunction(param1){ function innerFunction(param2){ return param2*2; } return innerFunction(param1); }?
??? 很明显,上述代码中的innerFunction()就是一个outFunction()的内部私有函数。使用这种形式来定义函数,主要有两点好处:
?
返回函数的函数
?
???? JavaScript 的函数通常是需要返回值的,如果没有明确地指定返回值,那么JavaScript就会默认地返回undefined。如前所述,JavaScript中的函数是也可以当作一种数据来看,那么函数的返回值也就可以是一个函数。如下所示:
?
?
function myFunction(){ alert("my value"); return returnFunction(){ alert("return value"); }; } //弹出警告框"my value" var test=myFunction(); //弹出警告框"return value" test();
?
??? 上述例子中,我们定义的函数myFunction首先弹出了一个警告框"my value",之后返回了一个匿名函数,此匿名函数的功能是弹出一个警告框"return value"。之后我们定义一个变量test,让这个变量的值为myFunction执行后的返回匿名函数的引用。之后我们来执行test(),就可以得到警告框"return value"。当然我们如果想立即使用返回的的函数,可以使用 myFunction()()这种形式来运行。这样就会连续弹出两个警告框。
?
?
?
重写自己的函数
?
??? 由上面的可以知道,函数的返回值可以是函数。因此,我们就可以想到,我们可以用新返回的函数来重写已有的函数。我们继续来改写上面的例子进行重写,
?
var myFunction=myFunction();
?
??? 那么,在我们之后再使用myFunction这个函数的时候,这个函数的功能已经变化了,它之后只会弹出一个内容为"return value"的警告框。
??? 这种方式和前面的自调用匿名函数的功能很像,当我们的函数只需要执行一次或者函数是用来实现初始化的功能,那么为了避免这个函数被多次调用,在我们初始调用这个函数之后我们将其重写一下就能实现这个功能。
??? 我们在上面的代码中是在外部来重写一个函数的,其实也可以在内部来重写,如下:
?
?
function myFunction(){ alert("myfunciton"); myFunction=function(){ alert("return value") } }?
?? 之后在我们第一次使用myFunction()这个函数,就会弹出一个警告框myFunciton,同时,我们重写了myFunction,之后再来使用myFunction这个函数时就会只得到"returnvalue"这个警告框。
?? 当然,结合前面的自调用匿名函数和内部函数的形式,我们也可以以如下方式来实现:
var myFunction=function(){ function setup(){ alert("init"); } function actualwork(){ alert("work"); } setup(); return actualwork; }?
??? 上面的这种机制对于我们在浏览器环境中运行应用时相当有用。估计浏览器适配对于大多数JavaScript程序员来说都是一个噩梦,因为对于某些功能,不同的浏览器所提供的JavaScript接口不一样。这样,我们可以实现一个来检测浏览器环境的函数,同时这个函数在执行之后重写自己,当然,重写的内容就是在当前浏览器环境下那些代码不兼容事件的支持函数。