[問題] 關於Callback的Scope疑問

看板Ajax作者 (石理克)時間9年前 (2015/02/26 13:19), 編輯推噓11(11036)
留言47則, 7人參與, 最新討論串1/1
打給厚,大家好! 我是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怎麼使用..... 再請各位大大解答! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.182.68 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1424927977.A.991.html

02/26 13:53, , 1F
阿...我是不是發錯版了
02/26 13:53, 1F

02/26 13:53, , 2F
看到標題有JavaScript 已為是js版
02/26 13:53, 2F

02/26 14:23, , 3F
發這裡沒錯啊
02/26 14:23, 3F

02/26 14:24, , 4F
所有js相關的都可以發,不過記得看版規
02/26 14:24, 4F

02/26 14:34, , 5F
喔喔~再麻煩大家了!js好好玩唷
02/26 14:34, 5F

02/26 14:34, , 6F

02/26 14:35, , 7F
利用bind可以把function的this綁定為某個物件
02/26 14:35, 7F

02/26 14:37, , 8F
事實上,closure當然也可以做出一樣效果,但是既然有內
02/26 14:37, 8F

02/26 14:37, , 9F
件的方式,那就用吧,除非你要支援超古老的瀏覽器,不
02/26 14:37, 9F

02/26 14:37, , 10F
然現代瀏覽器應每個都支援.bind()y
02/26 14:37, 10F

02/26 15:09, , 11F
02/26 15:09, 11F

02/26 16:20, , 12F
喔喔 !
02/26 16:20, 12F

02/26 16:32, , 13F

02/26 16:32, , 14F
bind好像是到ecmascript5才支援吧? 這裡用call就行
02/26 16:32, 14F

02/26 16:36, , 15F
call跟apply應該是全js環境都支援
02/26 16:36, 15F

02/26 16:37, , 16F
bind連ie8跟ie8以下都不支援....
02/26 16:37, 16F

02/26 18:39, , 17F
長知識了!
02/26 18:39, 17F

02/26 18:47, , 18F
ie8以下只剩xp再用了...你支援他幹嘛阿,市占率超低
02/26 18:47, 18F

02/26 18:47, , 19F
除非你要接政府的案子,不然去哪裡找一堆xp用...
02/26 18:47, 19F

02/26 18:49, , 20F
而且moz上就有polyfill了,沒有原生支援也沒差
02/26 18:49, 20F

02/26 22:44, , 21F
羨慕樓上的工作環境 (這世上真的還很多XP...)
02/26 22:44, 21F

02/26 22:46, , 22F
說真的因為有jQuery的存在要做到對早期IE支援並不會太
02/26 22:46, 22F

02/26 22:47, , 23F
難 所以最好不要輕易的採用太早的語法 除非你能一語
02/26 22:47, 23F

02/26 22:47, , 24F
而決啦 XD
02/26 22:47, 24F

02/26 22:47, , 25F
事實上就是能決定的人通常都不清楚狀況
02/26 22:47, 25F

02/26 22:48, , 26F
^^^^^^^^採用太晚
02/26 22:48, 26F

02/26 23:00, , 27F
還沒開始學jquery~現在寫html5遊戲
02/26 23:00, 27F

02/27 10:33, , 28F
根據statcounter資料,台灣IE8使用率還有8%(火狐也是8%...)
02/27 10:33, 28F

02/27 11:28, , 29F
bind 的效率很低哦 http://x.co/7ptau
02/27 11:28, 29F

02/27 13:40, , 30F
我相信需要效率的地方沒人會用callback啦...
02/27 13:40, 30F

02/27 13:41, , 31F
而且這樣用的理由是code比較乾淨,也容易讀懂
02/27 13:41, 31F

02/27 13:51, , 32F
http://jsperf.com/bind-speed-test 其實polyfill很好寫
02/27 13:51, 32F

02/28 20:41, , 33F
02/28 20:41, 33F

02/28 21:45, , 34F

02/28 21:46, , 35F
我不認為操縱別人的屬性真的可以接受...那種code很髒
02/28 21:46, 35F

02/28 21:50, , 36F
應該說根本違背了你寫OO的code的原則阿
02/28 21:50, 36F

02/28 23:54, , 37F
這篇好精彩,果然問大家學得更快
02/28 23:54, 37F

02/28 23:55, , 38F
爲何說callback 寫起來很髒呢?
02/28 23:55, 38F

03/01 00:18, , 39F

03/01 00:29, , 40F
耶!這樣宣告就可以找到蘋果!?
03/01 00:29, 40F

03/01 00:31, , 41F
callback不髒,髒的是直接操作別的object的屬性
03/01 00:31, 41F

03/01 00:32, , 42F
就像你寫了一個有'move' method的class叫Dog
03/01 00:32, 42F

03/01 00:33, , 43F
結果你要他走時不是呼叫dog.move(),而是dog.legs[1]++
03/01 00:33, 43F

03/01 00:33, , 44F
一樣,根本完全無視了OO的原則
03/01 00:33, 44F

03/01 00:35, , 45F
如果你不希望你的code變一次性的,這種事真的不要做
03/01 00:35, 45F

03/01 00:36, , 46F
原po可以嘗試打印this.constructor.name觀察看看
03/01 00:36, 46F

03/01 00:38, , 47F
探究一下你的this怎麼不是想要的那個obj, 在callback時
03/01 00:38, 47F
文章代碼(AID): #1KxgpfcH (Ajax)
文章代碼(AID): #1KxgpfcH (Ajax)