cuốn sách gpt4 ai đã làm

Tại sao 'on()' của mô hình Backbone.js lại lấy 'this' làm đối số cuối cùng, nếu trường hợp đó hầu như luôn như vậy?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 22:17:01 25 4
mua khóa gpt4 Nike

Tôi mới sử dụng Backbone và có một điều tôi không hiểu là tại sao phương thức "on()" của mô hình luôn lấy ba tham số - sự kiện, trình xử lý và ngữ cảnh.

Có vẻ như "cái này" hầu như luôn được sử dụng trong ngữ cảnh, tôi chưa thấy cách sử dụng nào khác. Kể cả nếu có thì tôi cũng chưa bao giờ nhìn thấy nó.

Vì vậy, câu hỏi của tôi là: khi nào nên sử dụng ngữ cảnh khác ngoài "cái này" và tại sao Backbone lại được thiết kế theo cách này? BTW, tôi hiểu lý do tại sao bạn cần cung cấp ngữ cảnh, chỉ là tôi đang thắc mắc tại sao cú pháp phương thức chỉ định rằng tôi sử dụng ba tham số thay vì đặt tham số cuối cùng là tùy chọn - dường như luôn là "cái này" và cảm thấy dư thừa. Tôi chắc chắn tôi đang thiếu một cái gì đó. Xin ai đó giúp tôi hiểu. Cảm ơn!

  • [EDIT] Tại sao bạn không thể làm điều gì đó như thế này:

    model.on = function(sự kiện, gọi lại){
    model.on_with_two_args.call(cái này, sự kiện, gọi lại, cái này);
    });

    model.on_with_two_args = function(sự kiện, gọi lại){
    /* bất kể nhiệm vụ của on() là gì */
    });

câu trả lời hay nhất

Giả sử chúng ta đang ở Chế độ xem dựa trên mô hình và chúng ta muốn liên kết với sự kiện thay đổi của mô hình:

this.model.on('change', this.render);

on Cuộc gọi sẽ thấy hai điều:

  1. Tên sự kiện, một chuỗi đơn giản.
  2. Trình xử lý, một chức năng.

on Không thể biết cái này.render TRONG cái này Nó có nghĩa là gì, nó chỉ thấy một chức năng; on Thậm chí không biết sự khác biệt giữa cuộc gọi trên và cuộc gọi này:

this.model.on('change', function() { ... });

Nếu hàm của bạn yêu cầu một ngữ cảnh cụ thể, bạn có hai tùy chọn:

  1. sử dụng _.liên kết Tạo một chức năng ràng buộc, _.bindTất cả , Hàm.bind , $.proxy , CoffeeScript => ,var_this = cái này Kỹ thuật đóng hoặc bất kỳ phương pháp tạo hoặc mô phỏng hàm bị ràng buộc nào.
  2. Cho nó biết bối cảnh bạn muốn thông qua:

    this.model.on('change', this.render, this);

Không thể mở rộng ngăn xếp cuộc gọi để xem bạn muốn cái nào cái này, vì vậy bạn phải nêu rõ ràng.

Backbone sẽ gọi lại cuộc gọi lại như thế này:

node.callback.apply(node.context || cái này, ...);

其中 nút.callback là chức năng gọi lại,nút.context là dành cho on Tham số thứ ba (nếu có). Nếu bạn không chỉ định bối cảnh thì khi nào cò súng Khi được gọi, bạn sẽ nhận được bất kỳ cái này;Trong ví dụ trên,cái này Điều gì cuối cùng sẽ trở thành mô hình.

所以 on Đối số thứ ba thực sự là tùy chọn, nhưng giá trị mặc định không hữu ích lắm và không có cách nào để chọn giá trị mặc định tốt hơn và thông tin cần thiết để chọn ngữ cảnh hợp lý không thể truy cập được trong JavaScript. Đây là lý do tại sao bạn thấy rất nhiều thứ này trong Backbone View _.bindAll(cái này, ...) người mẫu.


Nếu bạn đã thử một cái gì đó như thế này:

model.on = function(sự kiện, gọi lại){
model.on_with_two_args.call(cái này, sự kiện, gọi lại, cái này);
});

Sau đó cái này Trong bối cảnh đó thường là người mẫu Vì vậy, bạn thực sự sẽ nói:

model.on = function(sự kiện, gọi lại){
model.on_with_ba_args.call(model, sự kiện, gọi lại, model);
});

hoặc

model.on = function(sự kiện, gọi lại){
model.on_with_ba_args(sự kiện, gọi lại, mô hình);
});

Và không ai trong số đó có ý nghĩa. on TRONG cái này Giá trị và lời kêu gọi của on trong mã cái này Giá trị của > hầu như không quan trọng. cái này Trong JavaScript, nó không phải là một biến, nó là một từ khóa đề cập đến ngữ cảnh gọi hiện tại.

Về javascript - Tại sao 'on()' của mô hình Backbone.js lấy 'this' làm tham số cuối cùng, nếu điều đó gần như luôn luôn như vậy? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/13132970/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress