首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 閉包導致 onchange 找不到函式:事件綁定上下文丟失解決方案

     編輯:程式設計綜合問答

程式碼在 ready 函式內定義 change,並用 new Function("change("+j+")") 綁定 onchange,導致執行時找不到 change (ReferenceError)。

原因

  • new Function 建立的函式**在全域作用域執行**,無法存取外層函式的區域變數 change。
  • 當 ready 執行結束,其作用域銷毀,change 成為不可及的閉包變數。

解決方案

  1. 掛載到全域 (簡單但污染全域):
    window.change = change;
  2. 使用箭頭函式/匿名函式閉包捕獲 (推薦):
    document.getElementById(s[i]).onchange = () => change(j);
  3. addEventListener 綁定 (現代標準):
    document.getElementById(s[i]).addEventListener('change', () => change(j));
  4. 模組化寫法:將 change 定義為模組導出函式,或掛載在命名空間物件上。

修正後程式碼片段

ready: function() {
    function setup() {
        for (let i=0; i change(j));
        }
        change(0);
    }
    function change(v) { /* ... */ }
    setup();
}

核心原則:**避免 new Function / onclick="..." 字串式綁定,改用函式引用或箭頭函式保持詞法作用域**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved