Tôi có cùng một câu hỏi và sau đó tìm thấy câu trả lời, như sau:
Nó thực sự là dành cho
(0, foo.fn)();
Hãy nhớ rằng trong JavaScript, khi foo.fn()
được gọi , sau đó bên trong của fn
, this
bị ràng buộc với foo
. Nếu bạn sử dụng
var g = foo.fn;
g();
sau đó khi g
được gọi trên, this
được ràng buộc với đối tượng toàn cầu (window
, trong bối cảnh của một trình duyệt web).
Vì vậy, bạn có cần xác định g
như ở trên không? Bạn có thể làm điều gì đó chẳng hạn như
(foo.fn)();
Câu trả lời là không. JavaScript sẽ xử lý nó giống như foo.fn();
vì nó chỉ là foo.fn
với dư thừa ()
có thể bị xóa.
Nhưng có một cách để có được xung quanh, và nó là chính xác để sử dụng the comma operator, which Mozilla stated as
Nhà điều hành dấu phẩy đánh giá mỗi toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng cuối cùng
Vì vậy, sử dụng
(0, foo.fn)();
các (0, foo.fn)
sẽ được đánh giá để một tham chiếu đến chức năng, Lik e g
ở trên, và sau đó hàm được gọi. Và sau đó, this
không bị ràng buộc với foo
nhưng bị ràng buộc với đối tượng chung.
Vì vậy, mã được viết theo cách này, là "cắt liên kết".
Ví dụ:
var foo = {
fullName: "Peter",
sayName: function() { console.log("My name is", this.fullName); }
};
window.fullName = "Shiny";
foo.sayName(); // My name is Peter
(foo.sayName)(); // My name is Peter
(0, foo.sayName)(); // My name is Shiny
trùng lặp có thể xảy ra [javascript dấu phẩy hành] (http://stackoverflow.com/questions/5580596/javascript-comma-operator) –
Out of tò mò, có thể giúp bạn gửi nhiều bối cảnh của nơi này xuất hiện? – Austin
Tôi đã kiểm tra mã của https://www.google.fr/xjs/_/js/s/sy46,zr/rt=j/ver=-wnZQEUYm8E.en_US./d=0/rs=AItRSTNMBUOhWluxPqsKFY9CVTnMlxNz6w – korko