postmessage雙向通訊中,是不能使用**函式的。
window.postmessage(})
這樣是不行的,js會提示function不會被轉殖。
我猜啊因為postmessage是通過dom通訊,js物件會被json化
也就是說不能傳遞方法。
不過,話說回來,有什麼不能的呢,大不了,把function tostring一下,也是可以傳過去的。
那這裡就要考慮你傳callback是幹什麼用了,如果是作為一種自定義 的資料處理方法,你就tostring一下,過去隨便用用就好了,就好像foreach那樣,傳乙個方法,在foreach內部用用。
如果就是想要得到返回值,讓自己的書寫比較連續。業務邏輯比較連續,callback的結果不會再傳到對面。也就是說,callback始終是在本window下執行的。
保持業務邏輯連續的在你所寫的方法裡,不會因為呼叫postmessage而把業務處理邏輯跳躍到onmessage裡。
這是我要在這裡討論的。
1.很顯然,callback從來沒真正被傳遞到對面window裡。
2.callback將在onmessage(addlistoner裡註冊的接收事件)裡執行。
3.基於以上兩點 ,可以得出很簡單的結論。在本window裡快取callback,等onmessage接收到對面發回來的資料時,用callback處理即可。
話有點兒繞嘴,分步來一次,應該會更清楚一點。
1.用postmessage發訊息給對面。
2.對面收到訊息,處理,
3.用postmessage給本地發訊息。
4.本地接收到訊息,處理
那麼本地要用callback去處理,要知道用的是哪個function去處理。那麼本地有乙個指向callback的變數,就可以得到該callback。
而因為通訊不可能只一次,該callback會被放在陣列裡,同時會用唯一性id來標示它,而這個標示 也將被告訴對面window,再讓對面告訴本地,從而,本地的接收事件中,去呼叫這個function。
還是繞,
寫一下**吧,也許**一目了然。
對面的接收單元
window.addeventlistener("message
", function(e)
//打一杯可樂
var res = '
返回的可樂
'window.postmessage()
//發出去
}, false);
本地的單元
varwindow.addeventlistener("message", function(e)callbacks : {}
function點杯可樂(callback))
}function
吃肯德基的方法()
//喝可樂就是callback對吧
function
喝可樂()
很顯然,吃肯德基就是業務,那麼業務順序就是如此的,如果突然跳到接收事件裡去吃漢堡,喝可樂,總是很詭異的。
通過,快取callback假裝callback被傳遞出去,然後被呼叫,其實,就達到了目的。
以上。
給數字加上註解
注釋 命名清晰 簡單,單獨的變數使用,例如 變數定義 int a 1 判斷 if a 1 這些情況下通常會利用巨集定義來代替這些幻數 魔數,例如 定義 define max 1 使用 a max if a max 陣列使用,例如 gui程式設計需要定義5個按鍵,class,pop,定義 button...
當給main加上synchronized
1。在乙個同步化的靜態方法執行之前,它會獲取與它的class 物件相關聯的乙個管程 monitor 鎖 jls 8.4.3.6 所以在上面的程式中,主線程會在建立第二個執行緒之前獲得與pingpong.class 相關聯的那個鎖。只要主線程 占有著這個鎖,第二個執行緒就不可能執行同步化的靜態方法。具...
給flash加上了版權
抽空看了下contextmenu類和contextmenuitem類,偶然又看見f8幫助裡居然有單例模式的介紹,仿照寫了乙個,就當練習 圖是偶隨便畫的 點這裡 顯示 隱藏 不會用類的看這裡 fla中標準應該這麼寫 cr.show private var cm contextmenu cm new c...