本篇博文为codeSchool课程javascript——javascript road trip3笔记。
由于该网站很多表达很精辟,所以我能粘贴原文的地方就粘贴原文了,导致精致的英文和中文吐槽混杂,请见谅。
Level 1 - Forest of Function and Expression
- Building functions within code execution rather than at program load time:将function存在对象里。
- 传来传去把:
var greeting = function () { alert("Thanks for visiting the Badlands!\n"+"We hope your stay is...better than most."); }; closeTerminal(greeting); function closeTerminal(message){ ... message(); ... }
- give flexibility in choosing which functionality to build :
var greeting; //立一个flag if(flag){ greeting = function(){alert("1");}; }else{ greeting = function(){alert("2");}; } closeTerminal(greeting); function closeTerminal(message){ message(); //还有其他的东西 }
与array玩耍时间
- map( )方法:用于array,具体做的事情就是把array一节一节拆下来,操作一下,然后依次按到一个新的数组里,just like a loop。如:
顺序呢,暂时看到的都是从头至尾,然而我坚信,一定有很多花式玩法!亦可赛艇。var numbers = [1,2,3,4,5,6,7}; //var出一个双倍的map var result = numbers.map(function(arrayCell){ return arrayCell * 2; });
- 掐头去尾:push() ; shift()会返回被掐掉的头
- 小例子:订票系统
呵呵//一个订票系统。有等待时间。 //系统设定的等待时间 var parkRides = [["Birch Bumpers",40],["Pines Plugue",55],["Cedar Coaster",20],["Ferris Wheel of Firs",90]]; //出票的顺序 var fastPassQueue = ["Cedar Coaster","Pines Plugue","Birch Bumpers","Pines Plugue"]; var wantsRide = "Birch Bumpers"; function buildTicket(allRides,passRides,pick){//订票系统的函数(系统设定,出票顺序,用户想要的票) if(passRides[0] == pick){//如果第一个出的就是用户想要的票(隐含条件为不用等待) var pass = passRides.shift();//从出票顺序摘掉第一个存进pass里 return function(){alert("Quick! You've got a Fass Pass to " + pass + " !"); }; }else{//如果用户需要等待 for(var i = 0; i < allRides.length;i++){//loop if(allRides[i][0] == pick){//寻找需要的票 return function(){alert("A ticket is printing for " + pick + "!\n" + "Your wait time is about " + allRides[i][1] + "minutes."); }; } } } } var ticket = buildTicket(parkRides,fastPassQueue,wantsRide);//定义调用订票系统 ticket();//调用
- 要有return不知名函数的意识。然而,可不可以在return的匿名函数中做判断,loop?why?可以,这就是闭包的起点。昨晚的一个疑问变成今天学的东西,我真是习习蛤蛤。
Cold Closures Cove (传说中的b包!)
推荐一篇文章:http://kb.cnblogs.com/page/110782/
- closure : Returning a function from a function , complete with variables from an external scope.
- local variables。函数内部可以读取全局变量。声明local variable请用var,否则声明了全局变量!
- chain scope。函数可以读取他外部的变量,因为它“feels like globle ones”。而打破作用于规则的那个货他就是闭包。
- package deal。通过以上两点,我们可以通过神奇的手法读取局部变量了:
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
- 除了可以读取局部变量,bb还有一个用处:让这些变量的值始终保持在内存中。(我暂且认为这是闭包的判断标准)
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
- 下面来看code school上给出的订票例子:
//用闭包订票的例子 //订票系统,包含两个参数 function buildCoveTicketMaker(){ var passengerNumber = 0; return function(name){ passengerNumber++; alert("Your boat is " + transport + " , " + name + " !\n You are passenger #" + passengerNumber + " !\n" ); }; } //传一个参数进去,此时,这个东西在内存里(即var的作用啊!),然而在传入第二个参数之前,他都无法执行 var getSubmarineTicket = buildCoveTicketMaker("Submarine"); var getBattleShipTicket = buildCoveTicketMaker("BattleShip"); var getGaintSeagullTicket = buildCoveTicketMaker("GaintSeagull"); //激活! getSubmarineTicket("Pancake Painter");
- 例子:
//查询名单位置 function assignTorpedo(name,passengerArray){//传入名字和名单array for (var i = 0;i<passengerArray.length;i++){ if(passengerArray[i]==name){ return function(){ alert(name + " , your pass at Torpedo #" + (i+1) + "!\n"); }; } } } var subPassengers = ["单狗","活够","巴嘎","261","xixi","pancake","huadabing","hehe"]; var giveAssignment = assignTorpedo("261",subPassengers);//嘻嘻 调用闭包 giveAssignment();
以上为lever2,明天继续