#純靠北工程師3t2
----------
小弟我在某公司擔任遊戲工程師
最近公司使用cocos移植遊戲,本來想說一切順利,在網頁上預覽也都正常。不過改在cocos自帶的模擬器上看時災難發生了。
當遊戲讀完A動畫後遊戲就會崩潰
以正常方式想說大概是這動畫有錯,問題很好解決。結果越試越不對勁,花了幾個小時才發現不是A動畫的錯,問題出在是在比A先讀取的B動畫身上。只要B動畫讀取完,下一個讀取的不管是CDE動畫也都會崩潰,而且報錯是報在CDE身上。出錯原因是來自引擎內部的一個函數無法執行。
不過網路上沒人遇過這種錯誤,我只好硬著頭皮自己找,把B讀取後的引擎動作用step追了個遍,過了幾了小時才發現引擎有個obj被篡改了所以無法執行。
我本來想說我是不是無意間找到cocos的bug,打算繼續查下去準備反饋的時候發現了問題的癥結點。
以下是修改前後的code
前: spine = ... //以下省略
後: let spine = ... //以下省略
我當下真想把我眼前的鍵盤拔下來往自己頭上敲,誰第一時間會想到這變數名剛好跟模擬器引擎的window下的一個obj撞名啦(網頁版會這物件名字不一樣,所以當然會過)
直接被js的"特色"給栽了個坑,自己沒注意到把引擎的架構給蓋了,不崩潰才怪咧
我以為網路上忘記分號這種低級錯誤的笑話終究只是個笑話,直到今天這種忘記宣告的蠢錯誤活生生發生在我身上
----------
🗳️ [群眾審核] https://kaobei.engineer/cards/review
👉 [GitHub Repo] https://github.com/init-engineer/init.engineer
📢 [匿名發文] https://kaobei.engineer/cards/create
🥙 [全平台留言] https://kaobei.engineer/cards/show/4934
js匿名函式 在 JS 核心觀念筆記- 具名函式與匿名函式的基本認識 - 提姆寫程式 的推薦與評價
函式表達式 · 也稱為匿名函式。 · 宣告一個變數,其值為函式,可不具名,並且得到的值賦予到左邊的變數上。 · 再透過呼叫變數來執行函式內容。 並非所有的 ... ... <看更多>
js匿名函式 在 【 JavaScript 教學】 5 分鐘了解匿名函式 - YouTube 的推薦與評價
喜歡我的影片,請花兩秒鐘幫我按一下影片讚,支持我繼續創作 訂閱更多的Web 新手教學:https://bit.ly/codeshiba. ... <看更多>
js匿名函式 在 [心得] [ js ] 減少使用全域變數- 看板Ajax 的推薦與評價
最近的一些Javascript心得,把他寫成了筆記
來這邊分享一下,如果有什麼觀念錯誤的地方歡迎指正 ^^||
網頁好讀版: https://disp.cc/b/11-4CrK
在 JavaScript 中存取一個變數時
會先尋找目前的區域變數中有沒有這個變數,沒有的話再往上一層區域找
最後才會找全域變數,也就是 window 下的變數
例如
a = 1; // 全域變數a
b = 2; // 全域變數b
function myfun(){
var a = 3; //區域變數a
alert('a:'+a+',b:'+b); //會顯示 a:3,b:2
}
myfun(); // 執行
以往偷懶的寫法,都是把一堆需要跨函式的變數都設成全域變數
每個函式的名稱也都是全域變數
但這樣每次存取就都要一層一層的往上找直到全域範圍
而全域範圍已經有很多東西了,再加上一堆東西的話會造成效能不佳
且有可能會跟其他載入的 script 裡的名稱有衝突
所以比較好的方法是把自己的程式全都用一個立即執行的匿名函式包起來
並且把函式的名稱都改用區域變數來存
(function(){
var a = 1;
var b = 2;
var myfun = function(){
var a = 3; //區域變數a
alert('a:'+a+',b:'+b); //會顯示 a:3,b:2
}
myfun(); // 執行
})();
其中立即執行的匿名函式
(function(){ /*...*/ })();
也可以看成像下面這樣
function init(){ /*...*/ };
init();
宣告一個 init 函式後立即執行
簡寫成匿名函式的話就不用再幫他取名字了
也可以把 window 物件也傳進去變成一個區域變數 window
就可以用這個區域變數來存取其他全域變數了
例如可以讀取 jQuery 的 $ 變數
然後把 $ 也變成區域變數
(function(window){ //用區域變數 window 來存 全域變數 window
var $ = window.jQuery; // 把 jQuery 的 $ 變成區域變數
//...
})(window); //傳入全域變數 window
對物件使用"="傳給另一個值時,是使用傳址的方式,而不是傳值
所以只是同一個物件變成有兩個名字,而不會複製成另一個物件
a = {};
a.x = 1;
b = a;
b.x = 2;
alert(a.x); //顯示 2
alert(b.x); //顯示 2
把程式全部包在一個匿名函式後
就不能在 HTML 中使用 onclick 執行自己寫的函式了
<a href="#" id="myBtn" onclick="myfun(); return false;">按鈕1</a>
這樣的按鈕點下去會出現"myfun() is not defined"
要改成綁定事件的寫法
(function(){
$('#myBtn').click(function(){
//點按鈕後要執行的事情
myfun();
});
var myfun = function(){ /*...*/ };
})();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 175.181.51.65
※ 編輯: knuckles 來自: 175.181.51.65 (10/22 15:15)
... <看更多>