Tôi đã kiểm tra nhiều câu hỏi tương tự trên stackoverflow, chẳng hạn nhưgọi.gọi 1 , gọi.gọi 2 , nhưng tôi là người mới và không thể đưa ra bất kỳ nhận xét nào. Tôi hy vọng tôi có thể tìm thấy lời giải thích toàn diện và kỹ lưỡng về cách trình thông dịch JavaScript thực thi các chức năng này và đặt một câu hỏi mới tại đây.
Dưới đây là một số ví dụ:
hàm của tôi(p) { console.log(p) }
Function.prototype.call.call(my, this, "Xin chào"); // xuất ra 'Xin chào'
Ví dụ trên là cách sử dụng tiêu chuẩn của Function.prototype.call, tương đối dễ hiểu. Sự hiểu biết của tôi là: "của tôi" với tư cách là một đối tượng hàm thực thi phương thức kế thừa của nó "Function.prototype.call", tức là. my.(Function.prototype.call) => my.call(this, 'Xin chào')
Function.call.call(my, this, "Xin chào") // xuất ra 'Xin chào'
Tôi đang bối rối ở đây so với ví dụ trên. Tôi không biết trình thông dịch JavaScript hoạt động như thế nào ở đây. "Của tôi" có coi Function.call và Function.prototype.call là cùng một phương thức không?
Function.prototype.call(my, this, 'Hello2') // không xuất ra kết quả nào
Function.call(my, 'Hello2') // không xuất ra kết quả nào
Tôi không thể giải thích tại sao tuyên bố này không đưa ra lỗi? Trên thực tế, tôi không biết Function.prototype.call hoạt động như một phương thức như thế nào.
Function.prototype.call.call.call(my, this, "Hello3"); // xuất ra 'Hello3'
Tôi không thể giải thích cách trình thông dịch JavaScript diễn giải câu lệnh trên? Giải thích "gọi" từ phải sang trái? Vậy my.(Function.prototype.call.call) nghĩa là gì?
Function.prototype.call.call.call.call(my, this, "Hello4"); // xuất ra 'Hello4'
Tại sao tôi có thể nhập bất kỳ số lượng ".call" nào ở đây và kết quả vẫn giống nhau? Mỗi cuộc gọi có tiêu thụ một tham số làm đối tượng "này", nghĩa là chỉ ba tham số là không đủ? Câu hỏi tương tự câu hỏi trên
Sau đó, một số ví dụ khác:
var $ = Function.prototype.call
$(my, this, 'Hello5') // Ngoại lệ: TypeError: Function.prototype.call được gọi trên Proxy không tương thích
Tại sao nó không xuất ra bất cứ thứ gì, như trong ví dụ trên?
var v = Function.prototype.call.call
v(my, this, 'Hello6') // Ngoại lệ: TypeError: Function.prototype.call được gọi trên Proxy không tương thích
Điều này có nghĩa là khi biến v được sử dụng, trình thông dịch JavaScript sẽ cố gắng diễn giải v một mình mà không nhìn thấy đối số sau nó phải không? Vì vậy, người phiên dịch cho rằng 'đây' là biến toàn cục 'cửa sổ'? Tôi không biết trình thông dịch hoạt động khác nhau như thế nào giữa v() và Function.prototype.call.call()
Có ai có thể vui lòng giúp đỡ? Cảm ơn!
Function.prototype.call.call(my, this, "Xin chào");
thể hiện:
sử dụngCủa tôi
作为gọi
chức năngcái này
Các tham số (bối cảnh hàm). Trong trường hợp này,Hàm.prototype.call
được gọi.
因此,Hàm.prototype.call
sẽ được Của tôi
Được gọi là bối cảnh. Về cơ bản điều này có nghĩa là - nó sẽ là hàm được gọi.
Nó sẽ được gọi với các tham số sau:(đây là "Xin chào")
,TRONG cái này
là bối cảnh được đặt trong hàm được gọi (trong trường hợp này Của tôi
), tham số duy nhất được truyền là "Xin chào"
sợi dây.
Miễn là bạn Của tôi
Chức năng không được sử dụng dưới bất kỳ hình thức nào cái này
Bối cảnh - bạn có thể vượt qua bất cứ điều gì:
Function.prototype.call.call(my, 123, 'Hello2') // xuất ra "Hello2"
一旦 Hàm.prototype.call.call
Trích dẫn với Chức năng.prototype.call.call.call
cùng chức năng (và Hàm.call
Và my.call
), v.v., bạn có thể thêm bao nhiêu tùy ý .gọi
Quyền truy cập tài sản và không thay đổi bất cứ điều gì.
Đối với câu hỏi thứ hai của bạn:
var $ = Function.prototype.call
$(của tôi, cái này, 'Xin chào5')
không hoạt động vì ngữ cảnh của lệnh gọi hàm được đặt động trong khi gọi (trừ khi nó liên quan đến .bind()
ràng buộc (chức năng liên kết hoặc mũi tên ES2015).
Vì vậy, khi bạn vượt qua nó như $
Khi được gọi, bối cảnh không được đặt rõ ràng (vì nó là một biến, không phải đối tượng), nên theo mặc định, nó được đặt thành undefined
hoặc một đối tượng chung (tùy thuộc vào cách bạn chạy mã của mình).
Về javascript - sự khác biệt giữa Function.call, Function.prototype.call, Function.prototype.call.call và Function.prototype.call.call.call, 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/43424141/
Tôi là một lập trình viên xuất sắc, rất giỏi!