Ajax 板


LINE

这段程式要这麽拆解: (看下面的上色) google.maps.event.addListener(marker,'click', function(content){ return function() { infowindow.setContent(content);//set the content infowindow.open(map,this); } }(content)); 蓝底+紫底的部份的运算结果做为 addListener 的第三参数传进去 这个第三参数想要的是一个函式, 而等等你会看到这边的运算结果确实是一个函式 先讲结论, 这个函式并不是蓝底这一个, 而是亮红字这一个 事情是这样的 蓝底+紫底的部份其实只是一个单纯的函式呼叫 函式是蓝底字, 紫底字是呼叫 如果把蓝底函式叫做 wrapper 的话, 这一段其实就是 wrapper(content) 而已 这个函式如上所见它做的事单纯就是 return 亮红字的函式, 这里不妨叫它 handler 也就是说, wrapper 所做的事说穿了就只是 return handler; 而已 但究竟为什麽要叠这麽一层? 这就要说到 javascript 函式所谓 closure 的概念 closure 这个词中文译做「闭包」, 详细解释可以看中文维基 http://ppt.cc/rW9v 这里 wrapper 里的 handler 形成了一个闭包 这个闭包的用途是把中间的 content 变数包起来变成闭包的 upvalue 即使 handler 最终是被注册到系统去, 实际执行时是被系统呼叫 但是这个闭包里的 content 变数还是代表执行 wrapper 当下的 content 内容 (基本上可以说这就是闭包的用途) 而这当下的 content 是什麽? 从 wrapper 的内容可以看出来其实就是紫底那块当中的 content 变数 所以藉由闭包我们把一个函式需要的外部变数给包了起来 就不用另外对呼叫方做手脚了 (题外话, 对没有闭包的程式语言这就要费很大功夫 有的时候还需要呼叫方的程式配合...) 如果你有注意看的话会发现 infowindow 跟 map 变数好像也是这个闭包的 upvalue 但这段函式里没看到它的定义 这表示这两个变数它的内容会是 addListener 这行程式执行当下的变数内容 可能是外层函式或甚至是全域的变数 (然後内层函数的闭包继承了它的内容这样) 这也是闭包的好处之一 至於你後面问的 this 则是 javascript 的大哉问 关於这个可以看这篇文章 https://software.intel.com/zh-cn/blogs/2013/10/09/javascript-this 这里的状况是文中的第五种状况: handler 做为 callback 传进去 在这种状况下大家会有个默契, 会让 callback 里的 this 指向发生事件的物件 (用的是文中的第三种状况的技巧, 使用 call 或 apply 设定之) 也就是在这里的 this 就会是指 google.maps 这个元件了 -- 有人喜欢边玩游戏上逼; 也有人喜欢边听歌打字。 但是,我有个请求, 选字的时候请专心好吗? -- 改编自「古 火田 任三郎」之开场白 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.39.85
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Ajax/M.1408974424.A.956.html
1F:推 MangoTW: 推详解 08/26 01:00
2F:推 leochen0818: 推详解,虽然以我的LEVEL还不太能理解XD 08/26 09:56
3F:→ alair99: 很详细唷,谢谢大大 m(_ _)m 08/27 12:09
4F:推 shvanta: 原来那个this是这样来的,按照以前想法我以为是指向global 10/20 14:00
5F:→ shvanta: 感谢详细说明! 10/20 14:00







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP