Returning a function from a function, complete with variables from an external scope, is called a closure.

The entire contents of one of these inner functions will still be available outside the outermost function.

Example:

function buildTicket(allRides, passRides, pick){
if(passRides[0]==pick){
var pass = passRides.shift();
return function(){alert("Quick! You've got a Fast Pass to "+ pass +"!");};
}else{
for(vari = 0; i < allRides.length; i++){
if(allRides[i][0]==pick){
return function(){alert("A ticket is printing for "+ pick + "!\n" +
"Your wait time is about "+ allRides[i][1]+ "minutes.");};
}
}
}
}

Simaple example:

//Simple example
function testClosure(){
var x = 4;
return x;
} //We call testClosure() --> 4
//But we call x --> undefined function textClosure(){
var x = 4; //For closeX(), x just like a g_v
function closeX(){
return x;
};
return closeX;
}
var closureX = textClosure();
closureX(); //We get 4, because, x is binded with closeX()

What Closure can be used in patical?

--> A closure can make the creation of very similar funcitons ultra-efficient.

See the image below, buildCoveTicketMarker function return function.

According the usage, we pass the fuction with different param, then assign to different variables:

getSubmarineTicket, getBattleshipTicket, getGiantSeagullTicket

They are very similar function, but different usage!

Then we have a loot the what function return:

All of three return the same function, and the transport, name variable still the same, becasue we didn't pass the param yet.

------------------------Ex------------------------------

var hidden = mystery();
var result = hidden(3); function mystery ( ){
var secret = 6;
function mystery2 ( multiplier ) {
multiplier *= 3;
return secret * multiplier;
}
return mystery2;
}
// alert(result); --> 54 var hidden = mystery(4);
var result = hidden(2); function mystery ( input ){
var secret = 5;
function mystery2 ( multiplier ) {
multiplier *= input;
return secret * multiplier;
}
return mystery2;
}
// alert(result); --> 40 var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2); function mystery ( input ){
var secret = 4;
input+=2;
function mystery2 ( multiplier ) {
multiplier *= input;
return secret * multiplier;
}
return mystery2;
}
function mystery3 ( param ){
function mystery4 ( bonus ){
return param(6) + bonus;
}
return mystery4;
}
// alert(result); --> 122 function warningMaker( obstacle ){
return function () {
alert("Beware! There have been " + obstacle + " sightings in the Cove today!");
};
} var icebergAlert = warningMaker('iceberg');
icebergAlert(); function warningMaker( obstacle ){
return function ( number, location ) {
alert("Beware! There have been " +
obstacle +
" sightings in the Cove today!\n" +
number +
" " +
obstacle +
"(s) spotted at the " +
location +
"!"
);
};
}
var killerPenguinAlert = warningMaker("killer penguin");
var polarBearAlert = warningMaker("polar bear");
var icebergAlert = warningMaker("iceberg");
var flashBlizzardAlert = warningMaker("flash blizzard");
var snowYetiAlert = warningMaker("snow yeti"); killerPenguinAlert(6, "Ice Caves");
snowYetiAlert(1, "Blizzard Beach");

[Javascript] Closure Cove, 1的更多相关文章

  1. [Javascript] Closure Cove, Common mistake

    They’ve got a problem with their existing code, which tries to use a closure. Check it out: function ...

  2. 如何理解javascript closure ?

    接触过javascript的人应该听过闭包(closure),有一种观点认为是闭包赋予了javascript的强大能力,也赋予了它具备OOP的特征.既然javascript closure如此重要,那 ...

  3. [Javascript]Clouse Cove, 2 ,Modifying Bound Values After Closure

    function buildCoveTicketMarker(transport){ var passengerNumber = 0; return function(name){ passenger ...

  4. javascript closure 闭包 事件绑定

    先来一个基本的例子 <!-- 实现一段脚本,使得点击对应链接alert出相应的编号 --> <meta http-equiv="Content-Type" con ...

  5. About javascript closure

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures?redirectlocale=en-US&redi ...

  6. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  7. javascript closure

    http://www.jibbering.com/faq/notes/closures/ http://hi.baidu.com/bluedream_119/item/938dcd082b1e1880 ...

  8. 深入理解JavaScript闭包【译】

    在<高级程序设计>中,对于闭包一直没有很好的解释,在stackoverflow上翻出了一篇很老的<JavaScript closure for dummies>(2016)~ ...

  9. Javascript闭包——懂不懂由你,反正我是懂了

    摘要:“如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本就没弄懂.”好吧,我试着向一个27岁的朋友就是JS闭包(JavaScript closure)却彻底失败了. 越来越觉得国内没有教书育人的 ...

随机推荐

  1. android 注册广播接受者

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 动态注册 静态注册 动态注册是 通过java代码,注册. 静态注册 是xml清单文件中 ...

  2. android viewStub

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 开发应用的时候,需要根据条件决定显示某个视图, 这个时候可以用ViewStub Stub ...

  3. BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)

    题目链接 考虑树退化为链的情况,就是求一个最长(严格)上升子序列. 对于树,不同子树间是互不影响的.仿照序列上的LIS,对每个点x维护一个状态集合,即合并其子节点后的集合,然后用val[x]替换掉第一 ...

  4. macbook pro 开发帮助

    java安装目录 /Library/java/JavaVirtualMachines/ 设置快捷目录 vim .bash_profile 文件中追加一下信息:export dirname=目录路径 重 ...

  5. mysql数据库表迁移

    @ 把老数据库中的某个表倒出成sql文件 $mysqldump -uroot -p123456 my_db > my_db.sql (输入密码) @ 在新环境中导入 $sudo apt-get ...

  6. OBD-II Protocol -- SAE J1850 VPW PWM

    http://www.auto-diagnostics.info/j1850 j1850 The SAE J1850 bus bus is used for diagnostics and data ...

  7. Python机器学习实战&lt;一&gt;:环境的配置

    详细要学习的书籍就是<机器学习实战>Machine Learning in Action,Peter Harrington Windows下要安装3个文件,各自是; 1.Python(因为 ...

  8. C#子类如何调用父类

    C#中子类是如何调用父类的?带着这个问题,体验如下: □ 通过子类无参构造函数创建子类实例 创建父类Person和子类Student. public class Person { public Per ...

  9. 如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象

    "世界上不会有两片完全相同的树叶",这句话适用于现实世界.而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继. 当比较2个对 ...

  10. 解决Fragment每次进入都加载的问题

    1.首先了解一下fragment的生命周期 onCreate是指创建该fragment类似于Activity.onCreate,你可以在其中初始化除了view之外的东西,onCreateView是创建 ...