it-swarm-id.com

Bagaimana cara mengetahui apakah fungsi JavaScript didefinisikan

Bagaimana Anda tahu jika suatu fungsi dalam JavaScript didefinisikan?

Saya ingin melakukan sesuatu seperti ini

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Tapi itu membuat saya

panggilan balik bukan fungsi

kesalahan saat panggilan balik tidak ditentukan.

281
Aaron Lee
typeof callback === "function"
438
Tom Ritter

Semua jawaban saat ini menggunakan string literal, yang saya lebih suka tidak ada dalam kode saya jika mungkin - ini tidak (dan memberikan makna semantik yang berharga, untuk boot):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

Secara pribadi, saya mencoba untuk mengurangi jumlah string yang berkeliaran di kode saya ...


Juga, sementara saya sadar bahwa typeof adalah operator dan bukan fungsi, ada sedikit bahaya dalam menggunakan sintaks yang membuatnya muncul sebagai yang terakhir.

232
Jason Bunting
if (callback && typeof(callback) == "function")

Perhatikan bahwa callback (dengan sendirinya) mengevaluasi menjadi false jika undefined, null, 0, atau false. Membandingkan dengan null terlalu spesifik.

15

Metode-metode untuk mengetahui apakah suatu fungsi diimplementasikan juga gagal jika variabel tidak didefinisikan sehingga kami menggunakan sesuatu yang lebih kuat yang mendukung penerimaan string:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
8
patriciorocca

Baru mengenal JavaScript Saya tidak yakin apakah perilakunya telah berubah tetapi solusi yang diberikan oleh Jason Bunting (6 tahun lalu) tidak akan berfungsi jika mungkinFungsi tidak didefinisikan.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

Ini akan menimbulkan kesalahan ReferenceError: possibleFunction is not defined saat mesin mencoba menyelesaikan simbolFungsi mungkin (seperti yang disebutkan dalam komentar untuk jawaban Jason)

Untuk menghindari perilaku ini, Anda hanya dapat meneruskan nama fungsi yang ingin Anda periksa jika ada. Begitu

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

Ini menetapkan variabel menjadi fungsi yang ingin Anda periksa atau objek kosong jika tidak didefinisikan dan menghindari masalah yang disebutkan di atas.

6
NectarSoft

Mencoba:

if (typeof(callback) == 'function')
5
bdukes

Mungkin saya lakukan

try{
    callback();
}catch(e){};

Saya tahu ada jawaban yang diterima, tetapi tidak ada yang menyarankan ini. Saya tidak begitu yakin apakah ini cocok dengan deskripsi idiomatik, tetapi ini berfungsi untuk semua kasus.

Dalam mesin JavaScript yang lebih baru, finally dapat digunakan sebagai gantinya.

4
Quentin Engles
if ('function' === typeof callback) ...
4
Andrew Hedges
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
3
ConroyP

Coba ini:

callback instanceof Function
2
eWolf

Mencoba:

if (!(typeof(callback)=='undefined')) {...}
2
Brian

Jika Anda melihat sumber dari perpustakaan @Venkat Sudheer Reddy Aedama yang disebutkan, underscorejs, Anda dapat melihat ini:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

Ini hanya PETUNJUK saya, PETUNJUK jawaban:>

2
VentyCZ

Jika Anda menggunakan http://underscorejs.org , Anda memiliki: http://underscorejs.org/#isFunction

_.isFunction(callback);

Saya sedang mencari cara untuk memeriksa apakah fungsi jQuery didefinisikan dan saya tidak menemukannya dengan mudah.

Mungkin mungkin membutuhkannya;)

if(typeof jQuery.fn.datepicker !== "undefined")
1
miguelmpn

Jika Anda ingin mendefinisikan kembali fungsi, yang terbaik adalah menggunakan variabel fungsi, yang didefinisikan dalam urutan kejadiannya, karena fungsi didefinisikan secara global, di mana pun mereka terjadi.

Contoh membuat fungsi baru yang memanggil fungsi sebelumnya dengan nama yang sama:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition
0
David Spector

Untuk fungsi global, Anda dapat menggunakan yang ini alih-alih eval yang disarankan di salah satu jawaban.

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

Anda dapat menggunakan global.f instanceof Function juga, tetapi afaik. nilai Function akan berbeda dalam bingkai yang berbeda, sehingga hanya akan berfungsi dengan aplikasi bingkai tunggal dengan benar. Itu sebabnya kami biasanya menggunakan typeof sebagai gantinya. Perhatikan bahwa di beberapa lingkungan mungkin ada anomali dengan typeof f juga, mis. oleh MSIE 6-8 beberapa fungsi misalnya alert memiliki tipe "objek".

Dengan fungsi lokal, Anda dapat menggunakan yang ada di jawaban yang diterima. Anda dapat menguji apakah fungsinya juga lokal atau global.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

Untuk menjawab pertanyaan, kode contoh berfungsi untuk saya tanpa kesalahan di peramban terbaru, jadi saya tidak yakin apa masalahnya dengan itu:

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Catatan: Saya akan menggunakan callback !== undefined alih-alih callback != null, tetapi keduanya hampir sama.

0
inf3rno

Sebagian besar jika tidak semua jawaban sebelumnya memiliki efek samping untuk menjalankan fungsi

di sini praktik terbaik

anda memiliki fungsi

function myFunction() {
        var x=1;
    }
//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');
0
TexWiller

Jika callback() yang Anda panggil tidak hanya untuk satu kali dalam suatu fungsi, Anda dapat menginisialisasi argumen untuk digunakan kembali:

callback = (typeof callback === "function") ? callback : function(){};

Sebagai contoh:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

Batasannya adalah ia akan selalu menjalankan argumen callback meskipun tidak terdefinisi.

0
Nick Tsai