Làm thế nào mà chuyển đổi document.querySelectorAll('a')từ một
NodeList mảng thông thường?
Đây là mã mà chúng tôi có,
[].slice.call(document.querySelectorAll('a'), 0)
Hãy tháo dỡ nó trước,
[] // Array object
.slice // Accessing the function 'slice' present in the prototype of Array
.call // Accessing the function 'call' present in the prototype of function object(slice)
(document.querySelectorAll('a'),0)
// 'call' can have arguments like, (thisArg, arg1,arg2...n).
// So here we are passing the 'thisArg' as an array like object,
// that is a 'nodeList'. It will be served as 'this' object inside of slice function.
// And finally setting 'start' argument of slice as '0' and leaving the 'end'
// argument as 'undefined'
Bước: 1 Thực thi callchức năng
- Bên trong
call, ngoài thisArgphần còn lại của các đối số sẽ được thêm vào danh sách đối số.
- Bây giờ hàm
slicesẽ được gọi bằng cách ràng buộc thisgiá trị của nó là
thisArg(mảng giống như đối tượng đến từ document.querySelector) và với danh sách đối số. tức là] đối số startcó chứa0
Bước: 2 Thực thi slicechức năng được gọi bên trongcall
startsẽ được gán cho một biến slà0
- kể từ khi
endlà undefined, this.lengthsẽ được lưu trữ tronge
- một mảng trống sẽ được lưu trữ trong một biến
a
Sau khi thực hiện các cài đặt ở trên, việc lặp lại sau đây sẽ xảy ra
while(s < e) {
a.push(this[s]);
s++;
}
akết quả là mảng đầy sẽ được trả về.
PS Để hiểu rõ hơn về kịch bản của chúng tôi, một số bước cần thiết cho ngữ cảnh của chúng tôi đã bị bỏ qua khỏi thuật toán gốc của cuộc gọi và lát .
Array.prototype.slice.call(document.querySelectorAll('a'));là một cách thích hợp để viết đoạn mã bạn đã viết.