Misalnya, jika saya melakukan ini:
var q = document.querySelectorAll;
q('body');
Saya mendapatkan kesalahan "Permintaan ilegal" di Chrome. Saya tidak dapat memikirkan alasan apa pun mengapa ini perlu. Pertama, tidak demikian halnya dengan semua fungsi kode asli. Sebenarnya saya bisa melakukan ini:
var o = Object; // which is a native code function
var x = new o();
Dan semuanya bekerja dengan baik. Secara khusus saya telah menemukan masalah ini ketika berhadapan dengan dokumen dan konsol. Ada pemikiran?
javascript
invocation
pengguna1152187
sumber
sumber
Jawaban:
Itu karena Anda kehilangan "konteks" dari fungsi tersebut.
Saat Anda menelepon:
document.querySelectorAll()
konteks fungsinya adalah
document
, dan akan dapat diaksesthis
dengan penerapan metode itu.Saat Anda menelepon,
q
tidak ada lagi konteks - ini adalah objek "global"window
.Implementasi
querySelectorAll
mencoba untuk menggunakanthis
tetapi itu bukan lagi elemen DOM, ini adalahWindow
objek. Implementasinya mencoba memanggil beberapa metode elemen DOM yang tidak ada padaWindow
objek dan interpreter secara tidak mengejutkan memanggil foul.Untuk mengatasi ini, gunakan
.bind
di versi Javascript yang lebih baru:var q = document.querySelectorAll.bind(document);
yang akan memastikan bahwa semua permintaan berikutnya
q
memiliki konteks yang benar. Jika Anda belum punya.bind
, gunakan ini:function q() { return document.querySelectorAll.apply(document, arguments); }
sumber
function q(x){ return document.querySelectorAll(x); }
. Hal lain yang sangat saya suka tentang objek browser IE adalah bahwa beberapa di antaranya memberikan pengecualian hanya jika Anda mencoba membaca properti dari objek tersebut, jadi Anda perlu menguji fiturif( 'funcname' in browserobject)
daripada yang biasaif(browserobject.funcname)
!Dalam kasus saya, pemanggilan Illegal terjadi karena melewatkan variabel yang tidak dideklarasikan untuk berfungsi sebagai argumen. Pastikan untuk mendeklarasikan variabel sebelum meneruskan ke fungsi.
sumber
something
metode kehilangan konteks dokumenAnda bisa menggunakan seperti ini:
let qsa = document.querySelectorAll; qsa.apply(document,['body']);
sumber
Satu lagi solusi ringkas:
const q=s=>document.querySelectorAll(s); q('body');
sumber