闭包时是指内层的函数可以引用存在与包围他的函数内的变量,即使外层的函数的执行已经终止。功能不是一般的强大和复杂啊。
了解闭包必须首先了解变量的作用域:全局变量和局部变量(可以查看https://www.html.cn/article.asp?id=468)
闭包使代码更清晰,我们看一个离职:
?
XML/HTML代码
- <!DOCTYPE?html?PUBLIC?”-//W3C//DTD?XHTML?1.0?Transitional//EN”?”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>??
- <html?xmlns=“http://www.w3.org/1999/xhtml”>??
- ????<head>??
- ????????<meta?http-equiv=“Content-Type”?content=“text/html;?charset=utf-8”?/>??
- ????????<title>Untitled?Document</title>??
- ????</head>??
- ????<body>??
- ????????<div?id=“main”>我的闭包测试!</div>??
- ????????<script?type=“text/javascript”>??
- var?obj=document.getElementById(“main”); ??
- obj.style.border=“1px?#cdcdcd?solid”; ??
- setTimeout(function(){ ??
- ????obj.style.border=“1px?#ff0000?solid”; ??
- },4000); ??
- function?alertMsg(msg,time){ ??
- ????setTimeout(function(){ ??
- ????????alert(msg);//这个参数msg就是引用了alertMsg(msg,time)中的参数msg ??
- ????},time); ??
- } ??
- alertMsg(“我是css88.com站长:”,2000); ??
- ????????</script>??
- ????</body>??
- </html>??
用个闭包实现函数的Curry化,例子:
?
JavaScript代码
- function?addNum(num){ ??
- ????return?function(toAdd){ ??
- ????????return?num+toAdd; ??
- ????}; ??
- } ??
- var?addFive=addNum(5); ??
- alert(addFive(5));??
使用匿名函数来隐藏全局作用域变量的例子:
?
JavaScript代码
- (function(){ ??
- ????var?msg=“my?name?is?feiwen.”; ??
- ????window.onload?=?setTimeout(function(){ ??
- ????????alert(msg); ??
- ????},3000); ??
- })();??
使用匿名函数来激发创建多个使用闭包的函数所需的作用域
?
JavaScript代码
- var?obj=document.getElementById(“main”); ??
- var?items=[“click”,“keypress”]; ??
- for(var?i=0;i<items.length;?i++){ ??
- ????(function(){ ??
- ????????var?item=items[i]; ??
- ????????obj[“on”+item]=function(){ ??
- ????????????alert(“what?is?you?doing:”+item); ??
- ????????} ??
- ????})(); ??
- }??
最新评论
写的挺好的
有没有兴趣翻译 impatient js? https://exploringjs.com/impatient-js/index.html
Flexbox playground is so great!
感谢总结。
awesome!
这个好像很早就看到类似的文章了
比其他的教程好太多了
柯理化讲的好模糊…没懂