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 call
chức năng
- Bên trong
call
, ngoài thisArg
phầ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
slice
sẽ được gọi bằng cách ràng buộc this
giá 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ố start
có chứa0
Bước: 2 Thực thi slice
chức năng được gọi bên trongcall
start
sẽ được gán cho một biến s
là0
- kể từ khi
end
là undefined
, this.length
sẽ đượ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++;
}
a
kế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.