Bagaimana cara memeriksa apakah fungsi ada dalam JavaScript?

534

Kode saya adalah

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}

Namun, terkadang saya onChangetidak memuat. Kesalahan pembakar dengan

me.onChange bukan fungsi

Saya ingin menurunkan anggun karena ini bukan fitur yang paling penting dalam program saya. typeofmemberikan kesalahan yang sama.

Adakah saran tentang cara memastikan bahwa itu ada dan kemudian hanya dijalankan onChange?

(Tidak ada metode di bawah ini kecuali mencoba menangkap satu pekerjaan)

Alec Smart
sumber
1
@SteveChambers Saya telah melakukan itu. Terima kasih sudah mengingatkan saya.
Alec Smart
menangkap Pengecualian. periksa jawaban saya
Matteus Barbosa

Jawaban:

1227

Coba sesuatu seperti ini:

if (typeof me.onChange !== "undefined") { 
    // safe to use the function
}

atau lebih baik lagi (sesuai komentar UpVotes UpTheCreek)

if (typeof me.onChange === "function") { 
    // safe to use the function
}
Andrew Hare
sumber
249
=== 'fungsi' akan lebih baik daripada! = 'tidak terdefinisi'
UpTheCreek
3
@ James, karena pernyataan itu benar-benar melempar undefinedpengecualian dalam JavaScript. Saya mencobanya.
Mike Perrenoud
8
@UpTheCreek, itu akan sedikit berbahaya sebagai solusi umum karena versi IE yang lebih lama memperlakukan fungsi-fungsi tertentu sebagai objek, misalnya typeof window.alert === 'object'.
Noyo
1
Kenapa tidak pakai saja if (me.onChange) { // do something }?
BornToCode
3
@BornToCode karena itu me.onChangebisa berupa apa saja yang dievaluasi true, belum tentu fungsi (misalnya bisa berupa boolean, string, dll). Sebagai contoh, lihat jsfiddle.net/j5KAF/1
Ohad Schneider
108

Saya punya masalah ini.

if (obj && typeof obj === 'function') { ... }

terus melempar kesalahan referensi jika obj tidak ditentukan.

Pada akhirnya saya melakukan yang berikut:

if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }

Seorang kolega menunjukkan kepada saya bahwa memeriksa apakah itu !== 'undefined'dan kemudian === 'function'tentu saja berlebihan.

Lebih sederhana:

if (typeof obj === 'function') { ... }

Jauh lebih bersih dan berfungsi dengan baik.

Misha Nasledov
sumber
1
Adakah yang tahu mengapa potongan kode pertama dilemparkan ReferenceError? Bagi saya itu tidak masuk akal.
saidfagan
@saidfagan Lihat definisi ReferenceError developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Misha Nasledov
ini bekerja untuk saya
NewBie1234
1
Ada motif mengapa typeof obj == 'function' tidak cukup? ;-) Pengingat: operator uji kesetaraan ketat hanya masuk akal ketika operan statis kosong atau nol atau 0 atau tunduk pada amalgame pemain seperti ini.
Fabien Haddadi
16

Jika Anda menggunakan eval untuk mengkonversi string ke fungsi, dan Anda ingin memeriksa apakah metode eval ini ada, Anda akan ingin menggunakan typeof dan string fungsi Anda di dalam eval :

var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"

Jangan membalikkan ini dan mencoba typeof pada eval . Jika Anda melakukan ReferenceError akan dilemparkan:

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
dhulihan
sumber
21
eval == evil;)
Yeti
1
Ini mungkin jahat, tetapi ini sangat membantu ketika nama fungsi dalam variabel.
Luke Cousins
8
Anda dapat melakukan ini tanpa eval. Contoh:var a = 'alert'; window[a]('it works');
zennin
15

Bagaimana tentang:

if('functionName' in Obj){
    //code
}

misalnya

var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false

atau untuk kasus Anda:

if('onChange' in me){
    //code
}

Lihat dokumen MDN .

Nasser Al-Wohaibi
sumber
tetapi solusi ini tidak berfungsi setiap kali :( misalnya jika saya ingin mengetahuinya ada lastIndexOf()dalam string (kita tahu, itu, tetapi secara teoritis) typeof String().lastIndexOf === "function"itu benar, tetapi 'lastIndexOf' in Stringitu salah.
iiic
10

Coba typeof- Cari untuk 'undefined'mengatakan itu tidak ada, 'function'untuk suatu fungsi. JSFiddle untuk kode ini

function thisishere() {
    return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);

Atau jika:

if (typeof thisishere === 'function') {
    // function exists
}

Atau dengan nilai balik, pada satu baris:

var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false
Mat Carlson
sumber
9

Tidak melihat ini yang disarankan: me.onChange && me.onChange (str);

Pada dasarnya jika me.onChange tidak terdefinisi (yang akan terjadi jika belum dimulai) maka ia tidak akan menjalankan bagian terakhir. Jika me.onChange adalah suatu fungsi, ia akan menjalankan me.onChange (str).

Anda bahkan dapat melangkah lebih jauh dan melakukan:

me && me.onChange && me.onChange(str);

dalam kasus saya async juga.

Samir Alajmovic
sumber
5
//Simple function that will tell if the function is defined or not
function is_function(func) {
    return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}

//usage

if (is_function("myFunction") {
        alert("myFunction defined");
    } else {
        alert("myFunction not defined");
    }
Muhammad Tahir
sumber
solusi Anda tidak jelas, karena bertentangan dengan jQUery, yang aneh pada saat ini saya pikir, sehingga melempar kesalahan saat pengujian sederhana.
T.Todua
@tazotodua itu adalah fungsi penjelasan sendiri. jika Anda ingin menggunakan tanpa jquery. hapus saja bagian &&. itu adalah kondisi tambahan untuk memeriksa dan menghindari kesalahan.
Muhammad Tahir
Apakah kondisi di sisi kiri &&mengurus sesuatu yang tidak dimiliki jQuery isFunctiondi sisi kanan &&?
SantiBailors
5

Bagi saya cara termudah:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}
Tu4n3r
sumber
ini adalah jawaban yang benar, karena ini adalah string litteral .. Saya akan mengatakannya lebih baik seperti ini if ((typeof window["function_name"] !== 'undefined') && ((typeof window["function_name"] === 'function'))) { return true; } else { return false; }tetapi ini adalah penyesuaian kecil
Tn. Heelis
4

Saya akan melangkah 1 langkah lebih jauh untuk memastikan properti itu memang berfungsi

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}
Alex
sumber
3
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}
MiffTheFox
sumber
3

Saya suka menggunakan metode ini:

function isFunction(functionToCheck) {
  var getType = {};
  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}

Pemakaian:

if ( isFunction(me.onChange) ) {
    me.onChange(str); // call the function with params
}
David Douglas
sumber
3
function function_exists(function_name)
{
    return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));

ATAU

function function_exists(func_name) {
  //  discuss at: http://phpjs.org/functions/function_exists/
  // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: Steve Clay
  // improved by: Legaev Andrey
  // improved by: Brett Zamir (http://brett-zamir.me)
  //   example 1: function_exists('isFinite');
  //   returns 1: true

  if (typeof func_name === 'string') {
    func_name = this.window[func_name];
  }
  return typeof func_name === 'function';
}
Mohammad Lotfi
sumber
1
Tolong, beberapa penjelasan.
Gufran Hasan
Dalam dua kasus, cukup panggil function_exists dengan nama parameter fungsi untuk memeriksa keberadaan, mengembalikan bool.
Mohammad Lotfi
3

Beri tanda seru ganda yaitu !! sebelum nama fungsi yang ingin Anda periksa. Jika ada, itu akan mengembalikan true.

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false
Lalnuntluanga Chhakchhuak
sumber
3

Dalam beberapa kata: tangkap pengecualian.

Saya benar-benar terkejut tidak ada yang menjawab atau berkomentar tentang Pengecualian Menangkap di posting ini.

Detail: Ini dia contoh dimana saya mencoba untuk mencocokkan fungsi yang diawali oleh mask_ dan diakhiri dengan form isian "name". Ketika JavaScript tidak menemukan fungsinya, ia harus melempar ReferenceError yang dapat Anda tangani sesuai keinginan di bagian tangkapan.

function inputMask(input) {
  try {
    let maskedInput = eval("mask_"+input.name);

    if(typeof maskedInput === "undefined")
        return input.value;
    else
        return eval("mask_"+input.name)(input);

  } catch(e) {
    if (e instanceof ReferenceError) {
      return input.value;
    }
  }
}

Matteus Barbosa
sumber
2

Tanpa syarat

me.onChange=function(){};

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}
Itay Moav -Malimovka
sumber
2

Saya menduga bahwa metidak mendapatkan ditugaskan dengan benar onload.

Memindahkan panggilan get_ID ke acara onclick harus menanganinya.

Jelas Anda dapat menjebak lebih lanjut seperti yang disebutkan sebelumnya:

function js_to_as( str) {
  var me = get_ID('jsExample');
  if (me && me.onChange) {
    me.onChange(str);
  }
}
Wombleton
sumber
2

Saya selalu cek seperti ini:

if(!myFunction){return false;}

letakkan saja sebelum kode apa pun yang menggunakan fungsi ini

el Bung
sumber
2

Saya memiliki kasus di mana nama fungsi bervariasi sesuai dengan variabel (var 'x' dalam kasus ini) ditambahkan ke nama fungsi. Ini bekerja:

if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 
Sebastian H
sumber
2

Kode jQuery sederhana ini harus melakukan trik:

if (jQuery.isFunction(functionName)) {
    functionName();
}
chakraborty mainak
sumber
2

Saya sudah mencoba jawaban yang diterima; namun:

console.log(typeof me.onChange);

mengembalikan 'tidak terdefinisi'. Saya perhatikan bahwa spesifikasi menyatakan peristiwa yang disebut 'onchange' alih-alih 'onChange' (perhatikan camelCase).

Mengubah jawaban asli yang diterima menjadi yang berikut ini berfungsi untuk saya:

if (typeof me.onchange === "function") { 
  // safe to use the function
}
Alexander Fuchs
sumber
2

Jika Anda memeriksa fungsi yang merupakan plugin jQuery, Anda perlu menggunakan $ .fn.myfunction

if (typeof $.fn.mask === 'function') {
    $('.zip').mask('00000');
}
Lucas Bustamante
sumber
2

Saya juga telah mencari solusi elegan untuk masalah ini. Setelah banyak refleksi, saya menemukan pendekatan ini yang terbaik.

const func = me.onChange || (str => {}); func(str);

Julian
sumber
Jika Anda ingin meminimalkan, Anda juga bisa melakukan ini: (me.onChange||(_=>_))()Akan menjalankan fungsi jika ada, jika tidak akan melakukan apa-apa.
JSideris
Lebih baik me.onChange && me.onChange()untuk mencegah mendefinisikan fungsi void.
necrifede
2

Javascript Modern ke Penyelamatan!

Ini mungkin tidak memiliki peluang besar untuk dilihat dengan daftar jawaban yang panjang, tetapi ini sekarang dipecahkan * di tingkat bahasa dengan sintaks Chaining Opsional baru

me.onChange?.(str)

Sesederhana itu - onChangehanya dipanggil jika ada .

Jika onChangetidak ada, tidak ada yang terjadi, dan ekspresi kembali undefined- jadi jika itu memiliki nilai balik yang jika tidak Anda gunakan, Anda dapat memeriksa nilai ini !== undefinedsebelum melanjutkan.

Peringatan tepi kasus - jika onChange memang ada tetapi bukan suatu fungsi, Anda mendapatkan TypeError. Ini seperti yang Anda harapkan, itu sama dengan mencoba memanggil non-fungsi sebagai fungsi, tetapi layak untuk menunjukkan secara eksplisit bahwa Opsional Chaining tidak melakukan sihir apa pun untuk membuat ini hilang.

* Ya, secara teknis Chaining Opsional masih merupakan proposal TC39 tahap 4 jadi belum dalam spesifikasi ECMAScript, tetapi tahap 4 berarti sudah selesai dan penyertaannya pada dasarnya dijamin, hanya menunggu versi baru untuk dikirimkan. Anda dapat menggunakan sintaks dalam versi finalnya hari ini melalui Babel dengan keyakinan itu tidak akan berubah. Itu bahkan dalam naskah!

davnicwil
sumber
1

Berikut adalah solusi yang berfungsi dan sederhana untuk memeriksa keberadaan suatu fungsi dan memicu fungsi tersebut secara dinamis oleh fungsi lain;

Fungsi pemicu

function runDynamicFunction(functionname){ 

    if (typeof window[functionname] == "function") { //check availability

        window[functionname]("this is from the function it"); // run function and pass a parameter to it
    }
}

dan sekarang Anda dapat menghasilkan fungsi secara dinamis mungkin menggunakan php seperti ini

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

sekarang Anda dapat memanggil fungsi menggunakan acara yang dihasilkan secara dinamis

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynamicFunction(\"".$name_frm_somware."\");'>";

?>

kode HTML persis yang Anda butuhkan adalah

<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">
Aylian Craspa
sumber
0
    function sum(nb1,nb2){

       return nb1+nb2;
    }

    try{

      if(sum() != undefined){/*test if the function is defined before call it*/

        sum(3,5);               /*once the function is exist you can call it */

      }

    }catch(e){

      console.log("function not defined");/*the function is not defined or does not exists*/
    }
Ir Calif
sumber
0

Dan kemudian ada ini ...

( document.exitPointerLock || Function )();
Tuan James
sumber
halo Tuan, bagus, tapi bagaimana menurutmu tentang menangkap Pengecualian? periksa jawaban saya
Matteus Barbosa
Hai, terima kasih atas catatannya. Solusi Anda sangat mengagumkan. Saya mencoba menghindari paradigma 'coba-tangkap' bila memungkinkan atau lebih mudah, atau mungkin itu tersirat / dipaksakan oleh bantuan pihak ke-3. 'Eval' juga disukai karena berbagai alasan satu seperti mencoba-menangkap pembungkus lain sehingga waktu tertunda. Ada alternatif untuk eval yang mungkin 'melempar' juga. Saya pikir 'Fungsi baru (parms, tubuh)' mungkin akan melempar Anda kesalahan, tapi saya kira pertanyaan berikutnya bagi saya adalah perbandingan kecepatan, selain itu hanya pengurangan ukuran kode terbaik (lebih cepat berarti bagi saya). [Hmm ini terlihat baru. Saya belum mencobanya jsben.ch]
Master James
mmm menarik hal menarik tentang memanggil Fungsi baru saja. jangan ragu untuk mengirimkan saran perubahan Anda ke jawaban saya. terima kasih banyak
Matteus Barbosa
Ya maksud saya bahkan dalam bash menggunakan 'source myScript.sh' akan membiarkan Anda 'mengekspor' melalui alias dll. Itu seperti kelas dan perpustakaan selalu menjadi properti yang melekat dari setiap dan semua kode. Anda harus memiliki kode cek penerjemah js jika belum disetujui. Saya membangun satu dalam satu fungsi, yang merupakan tantangan menyenangkan untuk membantu memahami sifat aksiomatik paling sederhana dari kode, dan bahkan run-time tidak melampaui kemampuan siapa pun.
Tuan James
0

Coba yang ini:

Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new 
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true; 
return false;
}

Perlu diketahui bahwa saya telah menulis ini dengan ponsel saya. Mungkin berisi beberapa masalah huruf besar dan / atau koreksi lain yang diperlukan seperti misalnya nama fungsi

Jika Anda ingin fungsi seperti PHP memeriksa apakah var diatur:

Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}
SkullWritter
sumber
0

Untuk mengilustrasikan jawaban sebelumnya, berikut cuplikan JSFiddle cepat:

function test () {
console.log()

}

console.log(typeof test) // >> "function"

// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}

// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}


// confirm that the test is effective : 
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}

// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}

/* Expected :
function
true 
true 
false
false
*/

HoCo_
sumber
0
// just pass your tested function name instead of myFunctionName
if ( $.isFunction($.fn.myFunctionName) ) {
    console.log( 'write your code here.' );
}
Zabid Ahmed
sumber