js中的匿名函数
js中的匿名函数
what is anonymous function
第一种方式,创建匿名函数,形如以下:
(function(){
//代码
})();
匿名函数例子
(function(x, y){
alert(x + y);
})(2, 3);
这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.
第二种方式,创建匿名函数,函数表达式的右侧。
var double = function(x) { return 2* x; }
右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量double。
self-executing anonymous function
为什么(function {// code})();可以被执行, 而function {// code}();却会报错? // SyntaxError: Unexpected token (
分析:
(1). 首先, 要清楚两者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2). 其次, js”预编译”的特点:
js在”预编译”阶段, 会解释函数声明, 但却会忽略表式.
(3). 当js执行到function() {//code}();时, 由于function() {//code}在”预编译”阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
在解析器解析全局的function或者function内部function关键字的时候,默认是认为function声明,而不是function表达式,如果你不显示告诉编译器,它默认会声明成一个缺少名字的function,并且抛出一个语法错误信息,因为function声明需要一个名字。
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.
另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符
~(function(){
alert('water');
})();//写法有点酷~
void function(){
alert('water');
}();//据说效率最高~
+function(){
alert('water');
}();
-function(){
alert('water');
}();
!function(){
alert('water');
}();
anonymous function好处
1.避免占用全局变量名
2.参数保护,函数是独立作用域,传递参数可以保护临时变量,闭包可以保存循环中需要保留的临时变量,还有组件开发时将命名空间传递到函数中用闭包保护起来,即使命名空间被后面的代码重置,原变量被闭包保护将仍然生存
3.降低风险,因为没有变量名,中间代码又被闭包保护,js注入无法访问,减少被攻击风险
1.
(function(){
var a = "a";
b = "b";
function c(){
return c;
}
})()
console.log(a); // a is not defined(…)
console.log(b);
console.log(c()); // c is not defined(…)
anonymous function使用场景
一是回调函数,二是直接执行函数。