[问题] 关于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