惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
WordPress大学
WordPress大学
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
D
Docker
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
U
Unit 42
M
MIT News - Artificial intelligence
B
Blog
GbyAI
GbyAI
C
Check Point Blog
P
Proofpoint News Feed
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
IT之家
IT之家
Google DeepMind News
Google DeepMind News
V
V2EX
Stack Overflow Blog
Stack Overflow Blog

博客园 - Ray Wu

推荐纯真(CZ88.NET)IP库 10亿记录的分区讨论,高手进 测试问卷星问卷公开的问题 asp.net高性能之路:无缝切换HttpRuntime.Cache与Memcached,附代码 非常怪异的服务器网络问题【续】,附排查问题思路 非常怪异的服务器网络问题,请有经验的朋友帮忙看下 测试 也谈谈人人网的不正当竞争 腾讯被打残吧,360去死吧 测试 MBTI职业性格测试 很酷的问卷 自动将脚本放在页面底部 Asp.net页面静态内容自动从不同域名加载--极大提升客户端加载速度 我的网站PR升了没有? QQ邮箱:要把Bug当宝贝到什么时候? 使用异步页面,后台线程提高用户体验和服务器端性能 超轻量级的javascript 评分控件 在线问卷调查平台的创业体会
使用闭包优雅的为setInterval(setTimeout)传递参数
Ray Wu · 2009-01-06 · via 博客园 - Ray Wu

闭包的一个常见用法是在执行函数之前为要执行的函数提供参数。

例如:将函数作为 setInterval 函数的第一个参数,这在 Web 浏览器的环境下是非常常见的一种应用。

setInterval用于有计划地执行一个函数,要执行的函数是其第一个参数,其第二个参数是以毫秒表示的执行间隔。也就是说,当在一段代码中使用 setInterval时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。但是,传递函数引用的同时无法为计划执行的函数提供参数。

然而,可以在代码中调用另外一个函数,由它返回一个对内部函数的引用,再把这个对内部函数对象的引用传递给 setInterval函数。执行这个内部函数时要使用的参数在调用返回它的外部函数时传递。这样,setInterval在执行这个内部函数时,不用传递参数,但该内部函数仍然能够访问在调用返回它的外部函数时传递的参数:

function doSomething(paramA, paramB, paramC){
    
/* 返回一个由函数表达式创建的匿名内部函数的引用:- */
    
return (function(){
        
/* 这个内部函数将通过 - setInterval- 执行,而且当它执行时它会读取并按照传递给外部函数的参数行事: */
        paramA[paramB] 
= paramC;
    });
}
/* 调用这个函数将返回一个在其执行环境中创建的内部函数对象的引用。传递的参数最终将作为外部函数的参数被内部函数使用。返回的对内部函数的引用被赋给一个全局变量:-*/
var functRef = doSomething(menu, "display""none");
/* 调用 setInterval函数,将赋给变量 - functRef - 的内部函数的引用作为传递的第一个参数:- */ 
setInterval(functRef, 500);

这个就是闭包的典型应用了。