[問題] 關於Callback的Scope疑問

作者: sakyer (石理克)   2015-02-26 13:19:33
打給厚,大家好!
我是Javascript新手 想詢問關於js function scope的問題...
我有一個程式如下:
直接於mainLoop裡面使用show(),結果成功找到蘋果(this.apple)
http://jsfiddle.net/sakmor/4krzcs0g/9/
透過compare使用show(),結果無法到this.apple =undefined
http://jsfiddle.net/sakmor/4krzcs0g/
請問大大我要怎麼改,才能讓我透過compare()呼叫的show()可以
順利找到apple?
我稍微查了一下 是不是可以用Closure解決?
只是我不知道Closure怎麼使用.....
再請各位大大解答!
作者: sakyer (石理克)   2015-02-26 13:53:00
阿...我是不是發錯版了看到標題有JavaScript 已為是js版
作者: mmis1000 (秋月戀楓)   2015-02-26 14:23:00
發這裡沒錯啊所有js相關的都可以發,不過記得看版規
作者: sakyer (石理克)   2015-02-26 14:34:00
喔喔~再麻煩大家了!js好好玩唷
作者: mmis1000 (秋月戀楓)   2015-02-26 14:34:00
http://jsfiddle.net/4krzcs0g/14/利用bind可以把function的this綁定為某個物件事實上,closure當然也可以做出一樣效果,但是既然有內件的方式,那就用吧,除非你要支援超古老的瀏覽器,不然現代瀏覽器應每個都支援.bind()y
作者: Kenqr (function(){})()   2015-02-26 15:09:00
作者: sakyer (石理克)   2015-02-26 16:20:00
喔喔 !
作者: mrbigmouth (大嘴先生)   2015-02-26 16:32:00
http://jsfiddle.net/4krzcs0g/17/bind好像是到ecmascript5才支援吧? 這裡用call就行call跟apply應該是全js環境都支援bind連ie8跟ie8以下都不支援....
作者: sakyer (石理克)   2015-02-26 18:39:00
長知識了!
作者: mmis1000 (秋月戀楓)   2015-02-26 18:47:00
ie8以下只剩xp再用了...你支援他幹嘛阿,市占率超低除非你要接政府的案子,不然去哪裡找一堆xp用...而且moz上就有polyfill了,沒有原生支援也沒差
作者: mrbigmouth (大嘴先生)   2015-02-26 22:44:00
羨慕樓上的工作環境 (這世上真的還很多XP...)說真的因為有jQuery的存在要做到對早期IE支援並不會太難 所以最好不要輕易的採用太早的語法 除非你能一語而決啦 XD事實上就是能決定的人通常都不清楚狀況^^^^^^^^採用太晚
作者: sakyer (石理克)   2015-02-26 23:00:00
還沒開始學jquery~現在寫html5遊戲
作者: Kenqr (function(){})()   2015-02-27 10:33:00
根據statcounter資料,台灣IE8使用率還有8%(火狐也是8%...)
作者: eight0 (欸XD)   2015-02-27 11:28:00
bind 的效率很低哦 http://x.co/7ptau
作者: mmis1000 (秋月戀楓)   2015-02-27 13:40:00
我相信需要效率的地方沒人會用callback啦...而且這樣用的理由是code比較乾淨,也容易讀懂http://jsperf.com/bind-speed-test 其實polyfill很好寫
作者: swijo (熱風)   2015-02-28 20:41:00
作者: mmis1000 (秋月戀楓)   2015-02-28 21:45:00
http://jsbin.com/jivoni/1/edit?html,output我不認為操縱別人的屬性真的可以接受...那種code很髒應該說根本違背了你寫OO的code的原則阿
作者: sakyer (石理克)   2015-02-28 23:54:00
這篇好精彩,果然問大家學得更快爲何說callback 寫起來很髒呢?
作者: swijo (熱風)   2015-03-01 00:18:00
作者: sakyer (石理克)   2015-03-01 00:29:00
耶!這樣宣告就可以找到蘋果!?
作者: mmis1000 (秋月戀楓)   2015-03-01 00:31:00
callback不髒,髒的是直接操作別的object的屬性就像你寫了一個有'move' method的class叫Dog結果你要他走時不是呼叫dog.move(),而是dog.legs[1]++一樣,根本完全無視了OO的原則如果你不希望你的code變一次性的,這種事真的不要做
作者: Panasonic (ideas for life)   2015-03-01 00:36:00
原po可以嘗試打印this.constructor.name觀察看看探究一下你的this怎麼不是想要的那個obj, 在callback時

Links booklink

Contact Us: admin [ a t ] ucptt.com