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

JavaScript 參數傳遞:函數參數重賦值不影響外部變量

     編輯:程式設計疑難解答

問題代碼

var change = function(fn) {
    fn = function() { alert("success"); }; // 修改參數指向
};

var fun = function() { alert("ddd"); };
change(fun);
fun(); // 仍輸出 "ddd"

原因

JavaScript 是值傳遞(Call by Sharing)。fn 是參數變量,持有函數對象的引用。fn = ... 只是讓局部參數指向新函數,不影響外部 fun 變量。

正確修改外部函數的方法

// 1. 返回新函數,外部重新賦值
var change = function(fn) {
    return function() { alert("success"); };
};
fun = change(fun); // fun 現在指向新函數

// 2. 傳遞對象容器,修改屬性
var container = { fn: function() { alert("ddd"); } };
var change = function(obj) {
    obj.fn = function() { alert("success"); };
};
change(container);
container.fn(); // "success"

核心概念

  • 基本類型:值傳遞,不可修改原值
  • 對象/函數:引用傳遞,可修改內部屬性,但重新賦值參數不影響外部
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved