Rumah  >  Artikel  >  hujung hadapan web  >  Petua untuk mengesan sama ada fungsi ialah petua function_javascript asli JavaScript

Petua untuk mengesan sama ada fungsi ialah petua function_javascript asli JavaScript

WBOY
WBOYasal
2016-05-16 16:09:571031semak imbas

Dalam kerja pembangunan saya, saya sering menghadapi situasi di mana saya perlu menentukan sama ada fungsi adalah fungsi asli JavaScript Kadang-kadang ini adalah tugas yang sangat diperlukan Anda perlu mengetahui sama ada fungsi itu disediakan oleh penyemak imbas itu sendiri atau oleh a pihak ketiga. Enkapsulasi tiga pihak dan menyamar sebagai fungsi asli. Sudah tentu, cara terbaik adalah untuk memeriksa nilai pulangan kaedah toString yang melaksanakan fungsi ini.

JavaScript

Cara untuk menyelesaikan tugasan ini sangat mudah:

Salin kod Kod adalah seperti berikut:

fungsi ialahNative(fn) {
return (/{s*[kod asli]s*}/).test('' fn);
}

Kaedah toString akan mengembalikan bentuk rentetan kaedah ini, dan kemudian menggunakan ungkapan biasa untuk menentukan aksara yang terkandung di dalamnya.

Kaedah yang lebih berkuasa

Pengasas Lodash John-David Dalton menemui penyelesaian yang lebih baik:

Salin kod Kod adalah seperti berikut:

;(fungsi() {

// Digunakan untuk menyelesaikan `[[Kelas]]` nilai dalaman
var toString = Object.prototype.toString;

// Digunakan untuk menyelesaikan sumber dekompilasi fungsi
var fnToString = Function.prototype.toString;

// Digunakan untuk mengesan pembina hos (Safari > 4; benar-benar menaip tatasusunan khusus)
var reHostCtor = /^[objek ?Pembina]$/;

// Susun regexp menggunakan kaedah asli biasa sebagai templat.
// Kami memilih `Object#toString` kerana ada kemungkinan besar ia tidak dicemari.
var reNative = RegExp('^'
// Paksa `Object#toString` pada rentetan
Rentetan(kepadaString)
// Melarikan diri daripada mana-mana aksara regexp istimewa
.ganti(/[.* ?^${}()|[]/\]/g, '\$&')
// Gantikan sebutan `toString` dengan `.*?` untuk mengekalkan templat generik.
// Gantikan perkara seperti `untuk ...` untuk menyokong persekitaran seperti Rhino yang menambahkan maklumat tambahan
// seperti kaedah arity.
.replace(/toString|(function).*?(?=\()| untuk . ?(?=\])/g, '$1.*?') '$'
);

fungsi ialahNative(value) {
jenis var = jenis nilai;
Jenis kembali == 'fungsi'
// Gunakan `Function#toString` untuk memintas kaedah `toString` nilai itu sendiri
// dan elakkan daripada dipalsukan.
​ ? reNative.test(fnToString.call(value))
// Fallback kepada semakan objek hos kerana sesetengah persekitaran akan mewakili
// perkara seperti tatasusunan ditaip sebagai kaedah DOM yang mungkin tidak mematuhi
// corak asli biasa.
: (nilai && taip == 'objek' && reHostCtor.test(toString.call(value))) || false;
}

// eksport walau bagaimanapun anda mahu
module.exports = isNative;
}());


Sekarang anda lihat, ia kompleks, tetapi lebih berkuasa. Sudah tentu, ini bukan untuk tujuan keselamatan, ia hanya memberi anda maklumat sama ada ia adalah fungsi asli.
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn