it-swarm-tr.com

Bir JavaScript işlevinin tanımlanıp tanımlanmadığı nasıl anlaşılır

JavaScript'te bir işlev tanımlanmış olup olmadığını nasıl anlarsınız?

Böyle bir şey yapmak istiyorum

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

Ama bana bir

geri arama bir işlev değil

geri arama tanımlanmadığında hata.

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

Geçerli cevapların tümü, mümkünse kodumda bulunmamayı tercih ettiğim hazır bir dize kullanıyor - bu değil (ve önyükleme yapmak için değerli anlamsal anlam sağlar):

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

Şahsen kodumda dolaşan ip sayısını azaltmaya çalışıyorum ...


Ayrıca, typeof öğesinin bir işleç olduğunu ve bir işlev olmadığını bildiğim halde, ikinci sözde görünmesini sağlayan sözdizimi kullanımında çok az zarar var.

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

Eğer geri arama (kendi başına), false, undefined, 0 veya null ise, false olarak değerlendirir. null ile karşılaştırmak aşırı derecede spesifiktir.

15

Bir fonksiyonun uygulanıp uygulanmadığını anlatma yöntemleri, değişken tanımlanmadığında da başarısız olur, bu yüzden bir dize almayı destekleyen daha güçlü bir şey kullanıyoruz:

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

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

JavaScript'te yeni Davranışların değişip değişmediğinden emin değilim, ancak Jason Bunting'in (6 yıl önce) verdiği çözüm, eğer mümkünse tanımlanmazsa işe yaramaz.

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

Motor, symbolFonce işlevini çözmeye çalıştığında bu bir ReferenceError: possibleFunction is not defined hatası verir (Jason'ın cevabına yapılan yorumlarda belirtildiği gibi)

Bu davranıştan kaçınmak için, sadece var olup olmadığını kontrol etmek istediğiniz fonksiyonun adını iletebilirsiniz. Yani

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

Bu, tanımlanmamışsa denetlemek istediğiniz işlev veya boş nesne olarak bir değişken ayarlar ve bu nedenle yukarıda belirtilen sorunlardan kaçınır.

6
NectarSoft

Deneyin:

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

Yapabilirim

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

Kabul edilmiş bir cevap olduğunu biliyorum, ama kimse bunu önermedi. Bu deyimsel tanımına uygun olup olmadığından emin değilim, ama her durumda işe yarar.

Daha yeni JavaScript motorlarında bunun yerine finally kullanılabilir.

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

Bunu dene:

callback instanceof Function
2
eWolf

Deneyin:

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

Bahsedilen @Venkat Sudheer Reddy Aedama kütüphanesinin kaynak 'ına bakarsanız, altını çizin, şunu görebilirsiniz:

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

Bu sadece benim İPUCU, İPUCU cevap:

2
VentyCZ

http://underscorejs.org kullanıyorsanız, sahip olduğunuz: http://underscorejs.org/#isFunction

_.isFunction(callback);

Bir jQuery işlevinin tanımlanıp tanımlanmadığını nasıl kontrol edeceğimi düşünüyordum ve kolayca bulamadım.

Belki de gerekebilir;)

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

İşlevleri yeniden tanımlamak istiyorsanız, oluşum sırasına göre tanımlanmış işlev değişkenlerini kullanmak en iyisidir, çünkü işlevler nerede gerçekleştiğine bakılmaksızın genel olarak tanımlanır.

Aynı isimli önceki bir işlevi çağıran yeni bir işlev oluşturma örneği:

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

Global fonksiyonlar için, cevaplardan birinde önerilen eval yerine bunu kullanabilirsiniz.

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

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

global.f instanceof Function öğesini de kullanabilirsiniz, ancak afaik. Function değeri farklı karelerde farklı olacaktır, bu nedenle yalnızca tek bir kare uygulamasıyla düzgün şekilde çalışacaktır. Bu yüzden bunun yerine genellikle typeof kullanıyoruz. Bazı ortamlarda, typeof f ile de anormallikler olabileceğini unutmayın; MSIE 6-8 gibi bazı fonksiyonlar örneğin alert "nesne" tipine sahipti.

Yerel fonksiyonlarla, cevapları cevapta kullanabilirsiniz. Fonksiyonun yerel mi yoksa global mi olduğunu test edebilirsiniz.

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

Soruyu cevaplamak için, örnek kod son tarayıcılarda hatasız olarak benim için çalışıyor, bu yüzden sorunun ne olduğundan emin değilim:

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

Not: callback !== undefined yerine callback != null kullanırdım, ancak neredeyse aynısını yaparlar.

0
inf3rno

Çoğu önceki yanıtların tümü işlevi çağırmak için yan etkilere sahip değilse

burada en iyi yöntem

fonksiyonun var

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

callback() bir işlevde yalnızca bir kez aramıyorsanız, argümanı yeniden kullanmak üzere başlatabilirsiniz:

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

Örneğin:

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

    alert(text);

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

Sınırlama, tanımsız olmasına rağmen her zaman geri çağırma argümanını yürütmesidir.

0
Nick Tsai