JS怎么在事件綁定的閉包內控制外部函數的返回值??
1.函數功能:我現在有一個函數,這個函數可以傳遞一個參數進去。這個函數的主要功能是綁定各種事件處理函數,這些綁定的事件處理函數將會對傳遞進去的參數進行處理,并最終將處理后的結果通過閉包外的函數返回出去。
2.遇到的問題:事件處理函數是一些閉包,我不清楚怎么在閉包內控制外部函數的返回值。
3.代碼比如是這樣:
var canvas = document.getElementById("#canvas"); // 一個已經存在的canvas元素function test(canvas, src) { // src是一個圖片的url var context = canvas.getContext("2d"); var img = new Image(); img.src = src; img.onload= function() { context.drawImage(img, 0, 0, 100, 100); return canvas; // 預期目標是在這里實現外部函數test返回新的canvas對象 }; }var newCanvas =test(canvas, "abc.png"); //在此處預期取得新的canvas對象供別處使用
4.問題補充說明:
一、預期是:處理過后的新canvas對象作為test函數的返回值,但是如果在閉包外寫return,返回的值將會是未經處理的canvas,所以我覺得應該在img.onload對應的閉包內將新的canvas傳遞出去返回,但是不知道怎么實現;
二:必須要作為返回值傳出,因為我還有別的函數依賴于這個新的canvas傳遞過去才能執行,所以需要取得返回值以后才能執行。
三:可能我的示例代碼不夠清楚,其實這里var newCanvas =test(canvas, "abc.png");
我原來代碼中newCanvas
是一個已經建立的訪問器變量,在給它賦值的時候會調用訪<愛尬聊_讓生活聊出新高度>問器里的setter
,這樣就可以讓img
加載完以后立刻執行想執行的指令。類似于監聽數據變化,根據數據變化執行指令一樣。而且只要給不同的訪問器變量賦值,就可以執行不同的指令。
張智程20071227 59分鐘前
這也是你問題的原因所在。
123457021 58分鐘前
本人不才,目前所知道的是使用對象的復制來解決。好像有兩個吧,記不清了。Object.assign({}, obj)
、Object.create(obj)
。create
是繼承形式。assign
是拷貝形式。但該方案似乎對你的問題也不會有太大幫助。
我是石二 56分鐘前
所以當你試圖在函數中傳遞對象參數。傳遞的就是引用值,你在該引用上的修改直接映射到堆中數據。在函數中返回一個引用值時,事實上該值仍然指向的原始的數據。
紗塵幔桃生坐看云海把昨日還給我 55分鐘前
引用類型也就是我們常說的對象。它的值是一個指針地址。指向了堆中的實際對象。
啥東西呢 40分鐘前
所以,最終還是建議你根本就不需要返回一個新對象?。。。。〔挥媚敲绰闊┌?。
360U3177463572 35分鐘前
你這個canvas是全局的,可以直接用,返回干啥