javascript 匿名函数的用途到底是啥?

<script>

(function(){

var bp = document.createElement('script');

bp.src = '//push.zhanzhang.baidu.com/push.js';

var s = document.getElementsByTagName("script")[0];

s.parentNode.insertBefore(bp, s);

})();

</script>
跟 下面的写法有什么不同么? 为什么非得要用(function(){ ... })() 这么奇怪的写法?这样写有什么好处?

<script>

var bp = document.createElement('script');

bp.src = '//push.zhanzhang.baidu.com/push.js';

var s = document.getElementsByTagName("script")[0];

s.parentNode.insertBefore(bp, s);

</script>

1 分析: 函数为何要有名字? 是为了方便下次使用. 匿名函数, 即没有名字.  

2 用途: 通常不希望再次使用(即只使用一次的)的函数可以定义为匿名函数. 

3 使用示例: 

// 定义并使用一个匿名函数来打印从1到10的整数
(function (n) {
    for (var i = 1; i <= n; i++)
        console.log(i);
})(10);

4 扩展: 当然, 如果还是想再次使用匿名函数的话, 也有方法. 即把匿名函数赋给一个变量(funtion类型的变量), 想再次使用时, 使用该变量来调用即可.示例如下: 

// 定义一个匿名函数并将它赋给变量printN
var printN = function (n) {
    for (var i = 1; i <= n; i++)
        console.log(i);
};

// 通过变量printN来再次使用该匿名函数
printN(10);

5 运行效果果图如下:

图1


图2

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-22
JS中的匿名函数的用法及优缺点
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:

函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')

上面三种方法定义了同一个方法函数fnMethodName,

第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。

实际上,相当多的语言都有匿名函数。

二、函数字面量和Function()构造函数的区别

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。

var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };

Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。

Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。

用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。

var y = "global";

function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,

所以这项技术通常很少使用。

而函数字面量表达式和函数关键字定义非常接近。

考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,

但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。

三、匿名函数的代码模式

错误模式:其无法工作,浏览器会报语法错。

function(){ alert(1); }();

函数字面量:首先声明一个函数对象,然后执行它。

(function(){ alert(1); } ) ( );

优先表达式:

( function(){ alert(2); } ( ) );

void操作符:

void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。

四、匿名函数的应用

《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。

配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。

Javascript的函数式编程(functional programming)的基石。本回答被提问者采纳
第2个回答  2018-03-31

1、配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

2、《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。Javascript的函数式编程(functional programming)的基石。具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。

3、要说匿名函数,我们首先要由函数本身说起。函数的定义如下:函数是将唯一的输出值赋予给每一输入的“法则”。当然,这只是数学上的定义。但是,在计算机编程语言中,函数的定义也八九不离十。因为我们都知道,计算机中的函数,也类似数学定义中的描述,它是将输入的若干数据,经过代码设定的逻辑操作处理后,返回唯一的输出的一组代码组合块。——当然,特例是,输入的数据为空或输出的数据为空,或者两者都为空。

本回答被网友采纳
第3个回答  2016-06-15
JS中的匿名函数的用法及优缺点
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:

函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')
上面三种方法定义了同一个方法函数fnMethodName,

第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。

实际上,相当多的语言都有匿名函数。

二、函数字面量和Function()构造函数的区别
虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。

var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };

Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。

Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。

用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
var y = "global";
function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多, 所以这项技术通常很少使用。

而函数字面量表达式和函数关键字定义非常接近。

考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug, 但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。

配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。
第4个回答  2016-10-18
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。说白了就是隔离作用域,避免命名上的冲突。

搞明白JavaScript中的匿名函数
模仿块级作用域:JavaScript中没有块级作用域,变量会随作用域的结束而销毁。通过匿名函数可以模拟块级作用域。实现步骤如下:1. 通过匿名函数创建闭包。闭包允许访问函数作用域内的变量,并在函数外部使用。闭包的创建往往依赖于匿名函数。2. 模拟块级作用域,减少全局变量的使用。执行完毕后,相关变量被...

javascript中:(function(){})();如何理解?
在JavaScript中,函数可以定义为匿名,即没有名字的函数。匿名函数常常用于一些临时的、不需要重复调用的场景。它们可以在定义之后立即被执行,也可以被赋值给变量,以后通过变量来调用。二、函数表达式与IIFE 函数表达式是JavaScript中定义函数的一种方式。而IIFE则是一种特殊的用法,它允许你在定义一个函数后...

什么是匿名函数
匿名函数在JavaScript中是一种没有名称的函数,可以直接被定义和使用,无需引用函数名。匿名函数定义有两种方式:函数表达式和箭头函数。匿名函数常见用途包括临时定义函数并立即调用它。由于匿名函数没有名字,调试和异常追踪可能较困难。建议在开发中给函数命名,提高代码可读性和维护性。函数定义有两种类型:...

javascript中: (function(){})();如何理解?
javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环境,增加代码的兼容性。(function(){})是一个标准的函数定义,但是没有复制给任何变量。所以是没有名字的函数,叫匿名函数。没有名字就无法像普通函数那样随时随地调用了,所以在他定义完成后就...

javascript中: (function(){})();如何理解?
匿名函数有多种应用场景,例如作为事件处理程序,创建闭包等。与函数声明`function setFn() { ... }`不同,函数表达式`var setFn = function() { ... }`虽然也定义了函数,但这里函数是赋值给一个变量的,使其具有名称。而直接使用`function() { ... }`的方式就是典型的匿名函数表达式。总...

JavaScript 匿名函数\/lambda表达式的一次使用
结论是,JavaScript中的匿名函数\/lambda表达式可以巧妙地用于实现递归,无需显式命名函数。让我们通过一个求阶乘的例子来说明。在递归中,关键在于函数自身能够引用自身,这可以通过将函数作为参数传递实现。初始的尝试可能有些误导,因为忘记将函数本身作为第一个参数,修正后代码如下:在递归场景中,关键在于...

浅析JavaScript中的特殊函数及用法小结
匿名函数是其中一种特殊的函数形式,它没有名字,用于简化代码或仅在需要时临时使用。例如:\/\/匿名函数 function(){ \/\/匿名函数,会报错 return '一碗周'; } 尽管JavaScript不直接支持匿名函数语法,但它在回调函数和自调函数中有广泛应用。回调函数指的是作为参数传递给另一个函数的函数,而自调函数...

javaScript代码不懂,求解
(function(){})\/\/ jquery匿名函数的写法,作用是当页面初始化完毕,开始加载function内部js。整个代码的大致意思是给页面所有的按钮添加一个单击事件,用了this,页面应该只有一个按钮吧。该单击事件触发时根据按钮的name属性去判断。符合某一个条件打开一个页面,不符合打开另一个页面。获取按钮的name属性...

javascript什么是匿名函数和闭包?
在解释IIFE之前,先理解匿名函数。匿名函数即无名函数,不分配给变量使用。若尝试直接将匿名函数赋值给变量,再通过变量调用函数,会因JavaScript未能识别函数后的括号而报错。通过在匿名函数后添加括号,将其视为一个整体执行,便可形成IIFE。IIFE允许在定义时直接执行函数,并可将参数传递给函数。在上述示例...

javascript中的匿名函数和function有什么区别
匿名函数,用于闭包 function 用于定义函数或对象

相似回答