问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Js编程语言中,什么叫匿名自我调用函数?

发布网友 发布时间:2022-04-24 06:35

我来回答

1个回答

热心网友 时间:2022-04-20 09:25

匿名函数:就是没有函数名的函数。
函数的定义,大致可分为三种方式:

第一种:这也是最常规的一种

function double(x){
return 2 * x;
}

第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。

var double = new Function('x', 'return 2 * x;');

第三种:

var double = function(x) { return 2* x; }

注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。

匿名函数的创建

第一种方式:就是上面所讲的定义square函数,这也是最常用的方式之一。

第二种方式:

(function(x, y){
alert(x + y);
})(2, 3);

这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.

自执行的匿名函数

1. 什么是自执行的匿名函数?

它是指形如这样的函数: (function {// code})();

2. 疑问

为什么(function {// code})();可以被执行, 而function {// code}();却会报错?

3. 分析

(1). 首先, 要清楚两者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2). 其次, js"预编译"的特点:
js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
(3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符……

如:

!function(){
alert("另类的匿名函数自执行");
}();

匿名函数与闭包

闭包的英文单词是closure,这是JavaScript中非常重要的一部分知识,因为使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。

闭包的含义:闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕(这点涉及JavaScript作用域链)。

function checkClosure(){
var str = 'rain-man';
setTimeout(
function(){ alert(str); } //这是一个匿名函数
, 2000);
}
checkClosure();

这个例子看上去十分的简单,仔细分析下它的执行过程还是有许多知识点的:checkClosure函数的执行是瞬间的(也许用时只是0.00001毫秒),在checkClosure的函数体内创建了一个变量str,在checkClosure执行完毕之后str并没有被释放,这是因为setTimeout内的匿名函数存在这对str的引用。待到2秒后函数体内的匿名函数被执行完毕,str才被释放。

用闭包来优化代码:

function forTimeout(x, y){
alert(x + y);
}
function delay(x , y , time){
setTimeout('forTimeout(' + x + ',' + y + ')' , time);
}
/**
* 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰
* function delay(x , y , time){
* setTimeout(
* function(){
* forTimeout(x , y)
* }
* , time);
* }
*/

匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。

var oEvent = {};
(function(){
var addEvent = function(){ /*代码的实现省略了*/ };
function removeEvent(){}

oEvent.addEvent = addEvent;
oEvent.removeEvent = removeEvent;
})();

在这段代码中函数addEvent和removeEvent都是局部变量,但我们可以通过全局变量oEvent使用它,这就大大减少了全局变量的使用,增强了网页的安全性。

我们要想使用此段代码:

oEvent.addEvent(document.getElementById('box') , 'click' , function(){});
var rainman = (function(x , y){
return x + y;
})(2 , 3);
/**
* 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。
* var rainman = function(x , y){
* return x + y;
* }(2 , 3);

在这里我们创建了一个变量rainman,并通过直接调用匿名函数初始化为5,这种小技巧有时十分实用。

var outer = null;
(function(){
var one = 1;
function inner (){
one += 1;
alert(one);
}
outer = inner;
})();
outer(); //2
outer(); //3
outer(); //4

这段代码中的变量one是一个局部变量(因为它被定义在一个函数之内),因此外部是不可以访问的。但是这里我们创建了inner函数,inner函数是可以访问变量one的;又将全局变量outer引用了inner,所以三次调用outer会弹出递增的结果。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? WEB前端学习五 什么是闭包 javascript 函数中的匿名函数一定是闭包吗? 如何做好计划生育宣教工作 javascript 为什么要使用匿名函数 或者说 匿名闭包 计划生育协会关于争创“五好小级”“五有小组”的几件好事实事 如何做好计划生育生育服务登记工作总结 大家好,调查社会问题作文 1000字,谢谢 适宜张贴在教室得春联 贴春联的活动过程是什么? 新春佳节,家家户户张贴春联有什么作用? 贴对联的由来和寓意是什么? 贴春联的讲究有哪些? 庆祝九九重阳节贺词 九九重阳节祝福短语 九九重阳节祝福语有哪些? 自己榨的豆浆为什么没有外面卖的现磨豆浆好喝?他们都加了什么? 揭秘小吃摊的“现磨”豆浆到底能不能喝 豆浆中的大豆蛋白,对身体的好处都有哪些? 早餐摊豆浆,水了吧唧的那种在哪买,有豆浆粉能冲出来吗? 长期喝豆浆 有好处吗 JavaScript中的闭包是用来做什么的? 请问,录音笔有什么用? javascript另类闭包问题 录音笔究竟好不好用呢? Javascript中的闭包是什么意思?? 智能录音笔的录音效果好吗? JavaScript 闭包 录音的效果好吗,现在还有必要专门买录音笔么 js闭包和PHP闭包的区别 录音笔好用吗? 买个录音笔有用吗? JAVASCRIPT中的匿名函数指的是没有名字的函数吗,有何作用啊,在代码文本... 录音笔可以作为法律证据吗 js中闭包是什么意思,有什么作用,最好举例说明啊。 那录音笔什么功能最有用,买的时候需要注意哪些?怎么挑选 javascript中的window.ActiveXObject和闭包是什么意思有什么作用,在... 老罗说的AI录音笔大家有用过吗?录音笔的拾音效果怎么样? 搜狗录音笔录音效果好不好? 讯飞录音笔怎样,有用过的吗? 讯飞智能录音笔录音清晰准确吗?有用过的吗?