2011-12-15 37 views
6

Tôi là một chút bối rối như những gì xảy ra khi tôi gọi đoạn mã sau:Hiểu "này" bối cảnh với goog.bind và goog.net.Xhrio.send

goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this)); 

Tôi có một chức năng với điều này chữ ký:

myproject.MyClass.prototype.handleWelcome = function(response) 

Trước khi tôi bị ràng buộc, bối cảnh xử lýChào mừng bạn không có quyền truy cập vào các trường mẫu của lớp Javascript myproject.MyClass (dễ hiểu). Theo thông tin here, bây giờ tôi có ngữ cảnh của cá thể lớp. Tất cả tốt và tốt.

Ngữ cảnh của "điều này" trước khi tôi thực hiện thay đổi là gì?

Hãy tha thứ cho bất kỳ thành ngữ không phải Javascript nào tôi đang sử dụng - Tôi quen thuộc hơn nhiều với Java và có thể đang sử dụng hàng loạt các thuật ngữ.

EDIT

Ban đầu tôi đã có một số câu hỏi về những lập luận gì được trao cho gọi lại (trong trường hợp này một sự kiện với mục tiêu của loại goog.net.Xhrio) nhưng câu hỏi chính là về khoảng điều này và ràng buộc, vì vậy tôi loại bỏ các tiếp tuyến của q.

Trả lời

9

goog.bind tương đương với function.prototype.bind, nhưng tham số đầu tiên là hàm được ràng buộc, giá trị "này" thứ hai sẽ bị ràng buộc và bất kỳ tham số còn lại nào được ràng buộc với các tham số chính thức của hàm.

JavaScript có chức năng hạng nhất, nhưng họ không inheritly ràng buộc với một giá trị "này", vì vậy trừ khi bạn gắn nó, giá trị phụ thuộc vào cách nó được gọi là:

var x = { f : handler }; 
x.f(); // handler is called with "x" as the this value. 
handler(); // unspecified this 

Theo truyền thống, nếu " "giá trị này là không xác định, không xác định, hoặc null sau đó nó bị ép buộc vào" cửa sổ "toàn cầu này thường. Tuy nhiên, nếu bạn đang chạy trong chế độ nghiêm ngặt EcmaScript 5, giá trị vẫn không thay đổi (không xác định là "không xác định").

1

Nó phụ thuộc vào mã google làm gì, vì nó có thể kết hợp một cách rõ ràng this với thứ gì đó khi nó gọi lại hàm gọi lại của bạn, nhưng có lẽ nó chưa được xác định.

Đó là, bên trong thư viện google nơi nào đó, nó có một event handler mà làm điều gì đó như:

goog.whatever.randomHandler = function(foo) { 
    // ... 
    if (config.benFlynnHandler) { 
     config.benFlynnHandler.call(something_mysterious, someArgument); 
    } 
    // ... 

cũng "something_mysterious" có thể là null, nó có thể là một số đối tượng bán hấp dẫn, hoặc những người hiểu biết .

+0

Ahh thú vị. Vì vậy, một nơi nào đó nó sử dụng 'gọi' để gọi welcomeHandler của tôi với một số đối số? Tôi nghĩ rằng nó kết thúc là một XmlHttpResponse hoặc một cái gì đó như thế. –

+0

Tôi thực sự không biết nó đang làm gì; nó có thể làm một ".call()" hoặc nó có thể đang làm một cái gì đó khác. Vấn đề là nếu bạn không biết khung làm gì, thì bạn không biết. – Pointy

1
goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this)); 

điều đầu tiên trong this.handleChào mừng bạn tham chiếu đến lớp cha mẹ (hàm). thứ hai là tham chiếu đến hàm hiện tại;

Đó là cách mơ hồ nhất mà tôi có thể giải thích và có thể không chính xác 100% về mặt kỹ thuật, nhưng phải gần gũi. Họ có thể cầm bất cứ thứ gì hoặc không có gì.

Cách đơn giản nhất để xem điều gì đang xảy ra là chuyển cả hai sang bảng điều khiển và xem nội dung chứa, sử dụng firebug.

Hy vọng điều này sẽ hữu ích.

+0

Điều đó có ý nghĩa, nhưng có lẽ tôi nên làm cho câu hỏi của tôi rõ ràng hơn. Nếu tôi đã làm gì: goog.net.XhrIo.send ("/ welcome", this.handleWelcome); Ngữ cảnh của "điều này" sẽ xảy ra khi thực thi handleWelcome là gì? Tôi đã poking xung quanh một chút với debuggers cố gắng để có được một cảm giác tốt hơn cho nó. –

+0

Điều thứ hai này phải là một tham chiếu đến đối tượng trong đó liên kết đang được gọi, không phải là một hàm, đúng không? –

+0

đúng vậy –

Các vấn đề liên quan