Yanıtlar:
typeof callback === "function"
Geçerli yanıtların tümü, mümkünse kodumda olmamayı tercih ettiğim değişmez bir dize kullanır - bu yoktur (ve önyükleme yapmak için değerli anlamsal anlam sağlar):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
Şahsen, kodumda takılan dizelerin sayısını azaltmaya çalışıyorum ...
Ayrıca, typeof
bir işlevin değil, bir işleç olduğunun farkında olduğum halde, sözdizimini kullanmanın, ikincisi olarak görünmesini sağlayan çok az zarar vardır.
isFunction(not_defined))
nerede denedim not_defined
ve FireBug not_defined is not defined
doğru olanı döndü ama sizin fonksiyonu yanlış dönmelidir ve hata
not_defined
değerini iletmek için sembolü çözmeye çalışıyor ve çözemedi isFunction()
. isFunction()
Bu sorunu çözmek için hiçbir şey yapılamaz .
isFunction
ve sadece yapın (typeof no_function == typeof Function)
.
typeof(Function())
bir işlev olduğu için kullanmak gerekir ; ancak Array, Object ve diğer yerleşik prototipler de (daha iyi bir terim olmaması nedeniyle). Örneğin bir diziyi kontrol ediyor olsaydınız typeof(array) === typeof(Array)
; Kullanmak istediğiniz typeof(array) === typeof(Array())
dikkatli ve tutarlı olup olmadıklarını kontrol aslında fonksiyonunu değerlendirmek gerekir çünkü.
if (callback && typeof(callback) == "function")
Değerlendirir için (tek başına) olup bir geri arama Not false
bu ise undefined
, null
, 0
ya da false
. İle karşılaştırmak null
aşırı belirgin.
callback
kendisi "false-y" değeri olarak değerlendirilirse, typeof işlevinin asla "function" olamayacağını unutmayın .
Bir işlevin uygulanıp uygulanmadığını söylemek için kullanılan yöntemler, değişken tanımlanmadıysa da başarısız olur, böylece bir dize almayı destekleyen daha güçlü bir şey kullanırız:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
bunun yerine bakın doesthisexist
. Ancak, eval (hangi: kötü) gösterildiği gibi kullanıldığında yalnızca adlandırılmış işlevlerle çalışır - bu, söz konusu kullanım örneğiyle çalışmaz.
JavaScript'te yeni Davranışın değişip değişmediğinden emin değilim, ancak Jason Bunting (6 yıl önce) tarafından verilen çözüm mümkünse çalışmaz.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
Bu bir ReferenceError: possibleFunction is not defined
, motor olası sembolü çözmeye çalıştığında hata (yorumlarda Jason'ın cevabına belirtildiği gibi)
Bu davranışı önlemek için yalnızca var olup olmadığını kontrol etmek istediğiniz işlevin adını iletebilirsiniz. Yani
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
Bu, bir değişkeni kontrol etmek istediğiniz işlev veya tanımlanmamışsa boş nesne olarak ayarlar ve bu nedenle yukarıda belirtilen sorunları önler.
Deneyin:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
? :)
typeof
o - çünkü JavaScript yeni / farklı uygulama, daha sonra döner farklı bir şey (yerine "işlevi" belki "Fonksiyon") hissediyor daha az olası olurdu gibi yeni / farklı bir uygulama, typeof Function === typeof callback
semantik düzeyde aynı olması gerektiği için denetimi kırabilir .
typeof(callback) == "function"
yapabilirim
try{
callback();
}catch(e){};
Kabul edilmiş bir cevap olduğunu biliyorum, ama kimse bunu önermedi. Bunun deyimsel açıklamaya uyup uymadığından emin değilim, ancak tüm durumlar için çalışıyor.
Daha yeni JavaScript motorlarında finally
bunun yerine a kullanılabilir.
typeof callback
her halükarda kullanırım .
accepted_types.indexOf(typeof value) !== -1
ediyorum. Bu durumda, istisnalar bence yasaklayıcı olacaktır.
Bunu dene:
callback instanceof Function
Eğer kullanırsanız http://underscorejs.org , sahip: http://underscorejs.org/#isFunction
_.isFunction(callback);
Eğer callback()
bir fonksiyonun içinde sadece bir kez değil çağırarak, sen yeniden kullanım için argüman ilklendireceğiniz:
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ımlanmamış olmasına rağmen her zaman geri çağrı bağımsız değişkenini yürütmesidir.
Global işlevler için eval
, cevaplardan birinde önerilen 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
Afaik de kullanabilirsiniz . değerinin değeri Function
farklı çerçevelerde farklı olacaktır, bu nedenle yalnızca tek bir çerçeve uygulamasıyla düzgün çalışacaktır. Bu yüzden genellikle kullanıyoruz typeof
. Bazı ortamlarda typeof f
, örneğin MSIE 6-8 ile bazı fonksiyonların alert
"nesne" tipine sahip olabileceğini unutmayın .
Yerel işlevlerle kabul edilen cevaptaki işlevi 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 en son tarayıcılarda hatasız 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: Bunun callback !== undefined
yerine kullanırdım callback != null
, ama neredeyse aynı şeyi yapıyorlar.
Daha önceki tüm cevapların işlevi çağırmak için yan etkileri olmasa da çoğu
burada en iyi uygulama
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');
İşlevleri yeniden tanımlamak isterseniz, işlevler, gerçekleştikleri yere bakılmaksızın, küresel olarak tanımlandığından, gerçekleşme sıralarında tanımlanan işlev değişkenlerini kullanmak en iyisidir.
Aynı adda ö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
Bu benim için çalıştı
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
Tek hat çözümü:
function something_cool(text, callback){
callback && callback();
}