全局變量 typer 在函數 zhe() 中賦值 'spline',隨後調用 search(),但在 search() 的 AJAX 成功回調中 typer 為 undefined。
var typer;
function zhe() {
typer = 'spline';
search();
}
function search() {
$.ajax({
success: function(e) {
console.log(typer); // 此處為 undefined
// ...
}
});
}
var typer 被提升至函數/腳本頂部,初始值 undefined。賦值語句 typer = 'spline' 留在原位。
zhe() 執行流程:
1. typer = 'spline' // 同步賦值
2. search() 調用
3. $.ajax 發起請求 // 異步,註冊回調
4. zhe() 結束,主線程繼續
... 稍後 ...
5. AJAX 完成,觸發 success 回調
└─ 此時 typer 應為 'spline'(閉包捕獲)
success 回調內部有 var typer 或參數名衝突。zhe() 直接調用 search():如最佳回答所述,若直接調用 search(),typer 仍為初始 undefined。檢查入口點,確保業務流程為 用戶操作 → zhe() → search(),而非直接觸發 search()。
const ChartModule = (() => {
let typer; // 內部私有狀態
function zhe() {
typer = 'spline';
search();
}
function search() {
$.ajax({
success: function(e) {
console.log(typer); // 閉包訪問,無衝突
}
});
}
return { zhe };
})();
// 調用
ChartModule.zhe();
function search(chartType) {
$.ajax({
success: function(e) {
console.log(chartType); // 顯式依賴,無副作用
}
});
}
function zhe() {
search('spline');
}
let typer; // 塊級作用域,避免提升陷阱
// 但在異步回調中行為一致,核心問題仍是調用鏈
zhe() 賦值後、search() 調用前、AJAX 回調中分別 console.log('typer:', typer),觀察輸出序列。search()。typer 變量聲明,排除重複聲明。全局變量在異步回調中為 undefined, 90% 以上案例是因為繞過賦值邏輯直接調用了後續函數。JavaScript 閉包機制保證異步回調能訪問到外層作用域的最新值。解決核心在於梳理調用鏈,確保賦值操作在異步操作發起前同步完成。長期項目建議採用模塊化封裝或參數傳遞,消除全局狀態依賴。