邪修 JavaScript ,10 段“千萬別上生產(chǎn)”的黑魔法代碼
——僅供技術(shù)獵奇,切勿真用!
?? 每條都可能:性能爆雷、內(nèi)存泄漏、調(diào)試器崩潰、老板原地升天
面試炫技 OK,項(xiàng)目敢用就等死!
1?? 一行無限循環(huán)彈窗
while(1) alert('邪修JS');
瀏覽器直接卡死,用戶只能強(qiáng)制關(guān)機(jī)。
2?? 原型鏈污染全局
Object.prototype.toString = () => '??';
console.log(({}).toString()); // ??
所有對(duì)象行為被篡改,調(diào)試器原地崩潰。
3?? 隱式強(qiáng)制類型地獄
[] + {}; // "[object Object]"
{} + []; // 0
不同位置結(jié)果不同,全靠解析器心情。
4?? with
作用域黑洞
with({a:1}){ var a = 2; console.log(a); } // 2
作用域鏈動(dòng)態(tài)查找,IDE 無法靜態(tài)分析。
5?? 動(dòng)態(tài)函數(shù)名
const evil = new Function('a', 'b', 'return a + b');
console.log(evil(1, 2)); // 3
運(yùn)行時(shí)編譯代碼,靜態(tài)掃描工具全部失明。
6?? 隱式全局變量泄漏
function leak() { undeclared = 'leaked'; }
leak();
console.log(undeclared); // leaked
變量泄漏到全局,調(diào)試器找不到定義。
7?? 循環(huán)引用內(nèi)存泄漏
const a = {};
const b = {};
a.b = b;
b.a = a;
互相引用導(dǎo)致無法垃圾回收,內(nèi)存爆炸。
8?? eval
遠(yuǎn)程代碼執(zhí)行
eval(prompt('輸入代碼'));
直接把瀏覽器變成遠(yuǎn)程 Shell。
9?? 事件監(jiān)聽器無限疊加
document.addEventListener('click', () => console.log('click'));
document.addEventListener('click', () => console.log('click'));
// 重復(fù)添加,內(nèi)存爆炸
監(jiān)聽器無限疊加,性能直線下降。
?? 隱式類型轉(zhuǎn)換陷阱
console.log(!![]); // true
console.log(!!{}); // true
console.log(!!''); // false
隱式類型轉(zhuǎn)換導(dǎo)致邏輯混亂,調(diào)試器無法追蹤。
邪修口訣
“作用域鏈當(dāng)迷宮,原型鏈當(dāng)滑梯;
隱式轉(zhuǎn)換當(dāng)魔法,內(nèi)存泄漏當(dāng)煙花?!?/p>
PS
想要正經(jīng)的學(xué)習(xí) JS ,從編程獅的《JavaScript 入門課程》開始!