Truyền tham trị callback javascript, function lưu như thế nào trên stack & heap?

let v = 1;
const F = v => v = 2;
F(v);
console.log(v); //1

let obj = { hi: 123 };
const F = obj => obj.hi = 456;
F(obj);
console.log(obj); // { hi: 456 }

Đoạn code 1 và 2 thì em hiểu đã hiểu rõ dựa vào kiến thức địa chỉ ô nhớ trong stack và heap.

    let F1 = () => console.log("hi");
    const F2 = f => {
        f = () => console.log("ha"); // gán lại bằng một function khác
    }
    F2(F1);
    F1(); //hi

Các bác giải thích giúp em đoạn code thứ 3 với. Có cách nào để em thay đổi được function F1 trong đoạn code 3 như thay đổi thuộc tính obj trong đoạn đoạn code 2 không?

rõ ràng là 2 cái khác nhau, trên kia chỉ là thay đổi thuộc tính của object, còn function bạn muốn thay đổi gì?
mục đích của câu hỏi này để làm gì, bạn gặp bài toán nào mà cần phải làm như vậy?

3 Likes

Hàm F2 nhận vào một tham số là f.

Khi bạn pass F1 vào F2 thì f và F1 đang cùng trỏ tới một địa chỉ gọi là X.

Bên trong hàm F2 bạn thay đổi địa chỉ của f tới một địa chỉ khác gọi là Y thì thực tế F1 vẫn trỏ về X. Và bạn đang hiểu lầm về việc thay đổi địa chỉ cho f thì F1 cũng thay đổi theo. Khi F2 chạy xong thì F1 vẫn in ra “hi” vì nó vẫn trỏ về địa chỉ cũ chứ ko được thay đổi.

Nói chung là khi bạn pass một object vào function thì bạn chỉ có thể thay đổi porperty của object đó thôi (nếu nó không bị freeze), bạn ko thể thay đổi lại địa chỉ của object đó sang một địa chỉ khác. Tức việc bạn đang làm trong function F2.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?