程式碼在 ready 函式內定義 change,並用 new Function("change("+j+")") 綁定 onchange,導致執行時找不到 change (ReferenceError)。
new Function 建立的函式**在全域作用域執行**,無法存取外層函式的區域變數 change。ready 執行結束,其作用域銷毀,change 成為不可及的閉包變數。window.change = change;document.getElementById(s[i]).onchange = () => change(j);document.getElementById(s[i]).addEventListener('change', () => change(j));change 定義為模組導出函式,或掛載在命名空間物件上。ready: function() {
function setup() {
for (let i=0; i change(j));
}
change(0);
}
function change(v) { /* ... */ }
setup();
}
核心原則:**避免 new Function / onclick="..." 字串式綁定,改用函式引用或箭頭函式保持詞法作用域**。