文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript闭包和匿名函数的关系

2024-04-02 19:55

关注

这篇文章主要讲解了“JavaScript闭包和匿名函数的关系”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript闭包和匿名函数的关系”吧!

前面讲了一篇在for循环中加setTimeout输出内容,我们用到了一个闭包,但同时也可以说是匿名函数,到底匿名函数和闭包有没有关系呢?【答案是它们之间没有关系】

匿名函数

匿名函数,顾名思义,就是没有名字的函数,与之对应的就是有名字的函数,也叫具名函数。

//匿名函数

function (){

    console.log('匿名函数');

}

//具名函数

function myFn(){

    console.log('具名函数');

}

//变量a就是匿名函数的名字

var a = function(){

    console.log('a就是匿名函数的名字');

}

如果我们直接在控制台中运行匿名函数,会发现报错,无法执行。匿名函数是无法执行的,一般用到匿名函数的时候都是立即执行,也叫自执行匿名函数或者自调用匿名函数,一般人都叫立即执行函数。

立即执行函数

比较常见的立即执行函数如下:

;(function(){

    console.log('caibaojian.com');

})()

;(function(){

    console.log('caibaojian.com');

}());

上面这两种都是典型的立即执行函数写法,两者的区分就是一个执行在匿名函数括号外面,另外一个发起执行的括号在匿名函数里面。比较常见的是第一种写法,括号在匿名函数的括号外面。

步骤分解:

1. 首先声明一个匿名函数 function(){alert('我是匿名函数')}。

2. 然后在匿名函数后面接一对括号 (),调用这个匿名函数。

那为什么还要用一个括号包起来呢?其实是为了兼容JS的语法,如果我们不加括号,直接写成

function (){alert('我是匿名函数')}()

浏览器会报语法错误,想要通过浏览器的语法检查,必须加点小东西,比如下面几种

(function(){alert('我是匿名函数')} ()) // 用括号把整个表达式包起来

(function(){alert('我是匿名函数')}) () //用括号把函数包起来

!function(){alert('我是匿名函数')}() // 求反,我们不在意值是多少,只想通过语法检查。

+function(){alert('我是匿名函数')}()

-function(){alert('我是匿名函数')}()

~function(){alert('我是匿名函数')}()

void function(){alert('我是匿名函数')}()

new function(){alert('我是匿名函数')}()

实际上,立即执行函数的作用只有一个:创建一个独立的作用域,在这个作用域里面,外面访问不到,避免变量污染。比如我们前面的一篇文章,setTimeout的第三个参数里面讲到的一道题目。

for(var i=0;i<6;i++){

    setTimeout(function(){

        console.log(i); //为什么输出的总是 6,而不是0,1,2,3,4,5

    },i*1000);

}

我们发现上面这个定时器总是输出6,因为setTimeout里面的执行函数是异步的,执行的时候,i的值是贯穿整个作用域的,而不是单独一个给每个定期器分配了一个i,for运行完的值是6,此时输出就总是6了。

那怎么解决呢?用立即执行函数给每个定时器创造一个独立作用域即可。

for(var i=0;i<6;i++){

    (function(j){

        setTimeout(function(){

            console.log(j);

        },j*1000);

    })(i);  

}

在for循环执行时,立即执行函数就已经有了结果了。而每个立即执行函数里面的j值就是独立的一个,不会受后面影响。所以会分别执行5次定时器。

//第一个立即执行函数

(function(0){

    setTimeout(function(){

        console.log(0);

    })

})(0);

//第二个立即执行函数

(function(1){

    setTimeout(function(){

        console.log(1);

    })

})(1);

//……

//第六个立即执行函数

(function(5){

    setTimeout(function(){

        console.log(5);

    })

})(5);

i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 j 「分别」是 0、1、2、3、4、5。

上面说了这么多关于匿名函数和立即执行函数的,相信你对这两个概念已经很清楚,那么闭包跟匿名函数有关系吗?

闭包

js闭包是指有权访问另一个函数作用域中的变量的函数,个人认为js闭包最大的用处就是防止对全局作用域的污染。闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

我们可以分离出上面的第一个立即执行函数

function box(i){

    setTimeout(function(){

        console.log(i);

    },i*1000);

}

box(1);

//或者这样

function box(i){

    function inner(){

        console.log(i);

    }

    return inner;

}

var outer = box(1);

outer();

感谢各位的阅读,以上就是“JavaScript闭包和匿名函数的关系”的内容了,经过本文的学习后,相信大家对JavaScript闭包和匿名函数的关系这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯