Відповіді:
typeof callback === "function"
У всіх поточних відповідях використовується буквальний рядок, який я, мабуть, не маю, якщо це можливо, у своєму коді - це не має (і надає цінний смисловий сенс для завантаження):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
Особисто я намагаюся зменшити кількість струн, що звисають у моєму коді ...
Крім того, хоча я знаю, що typeof
це оператор, а не функція, мало використання шкоди у використанні синтаксису, завдяки чому він виглядає як останній.
isFunction(not_defined))
де not_defined
ім'я функції, яка не визначена, і FireBug повернув, not_defined is not defined
що є правильним, але ваша функція повинна повертати помилкові та не створювати помилок ...
not_defined
, щоб передати його значення isFunction()
і не зможе його усунути. Нічого не можна зробити з визначення, isFunction()
щоб вирішити цю проблему.
isFunction
і робити просто (typeof no_function == typeof Function)
.
typeof(Function())
оскільки функція - це функція; але так є Array, Object та інші вбудовані прототипи (за відсутності кращого терміна). Якби ви перевіряли масив, ви б не використовували, typeof(array) === typeof(Array)
наприклад; ви б використовували, typeof(array) === typeof(Array())
тому що вам дійсно потрібно оцінити функцію, якщо ви обережні та послідовні.
if (callback && typeof(callback) == "function")
Зверніть увагу , що зворотний виклик (сам по собі) приймає значення , false
якщо воно undefined
, null
, 0
, або false
. Порівняння з null
надмірно специфічним.
callback
сама оцінює значення "false-y", то її typeof ніколи не може бути "функцією".
Ці методи визначити, чи реалізована функція, також не вдається, якщо змінна не визначена, тому ми використовуємо щось більш потужне, що підтримує отримання рядка:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
цього doesthisexist
. Однак використання eval (що: є злом), як показано, працюватиме лише з названими функціями - це не буде працювати з випадком використання у питанні.
Нове в JavaScript Я не впевнений, чи змінилася поведінка, але рішення, яке надав Джейсон Бантінг (6 років тому), не буде працювати, якщо можливоФункція не визначена.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
Це призведе до ReferenceError: possibleFunction is not defined
помилки, коли двигун намагається вирішити символ можливогофункції (про що йдеться у коментарях до відповіді Джейсона)
Щоб уникнути такої поведінки, ви можете передати лише ім'я функції, яку ви хочете перевірити, чи існує вона. Тому
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
Це встановлює змінну як функцію, яку ви хочете перевірити, або порожній об'єкт, якщо він не визначений, і таким чином уникає проблем, згаданих вище.
Спробуйте:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
? :)
typeof
повернути щось інше пізніше (можливо, "Функція" замість "функції") через нову / іншу реалізацію JavaScript - здається, було б менше ймовірності, що нова / інша реалізація порушить typeof Function === typeof callback
перевірку, оскільки вона повинна бути однаковою на семантичному рівні.
typeof(callback) == "function"
Я можу зробити
try{
callback();
}catch(e){};
Я знаю, що є прийнята відповідь, але ніхто не запропонував цього. Я не дуже впевнений, чи відповідає це опису ідіоматичного, але це працює у всіх випадках.
У новіших двигунах JavaScript finally
замість нього можна використовувати.
typeof callback
будь-якому випадку.
accepted_types.indexOf(typeof value) !== -1
чи є він у діапазоні типів. У цій ситуації винятки були б, на мою думку, заборонними.
Спробуйте це:
callback instanceof Function
Якщо ви використовуєте http://underscorejs.org , у вас є: http://underscorejs.org/#isFunction
_.isFunction(callback);
Якщо callback()
ви викликаєте функцію не один раз у функції, ви можете ініціалізувати аргумент для повторного використання:
callback = (typeof callback === "function") ? callback : function(){};
Наприклад:
function something_cool(text, callback) {
// Initialize arguments
callback = (typeof callback === "function") ? callback : function(){};
alert(text);
if (text==='waitAnotherAJAX') {
anotherAJAX(callback);
} else {
callback();
}
}
Обмеження полягає в тому, що він завжди буде виконувати аргумент зворотного виклику, хоча він не визначений.
Для глобальних функцій ви можете використовувати цю замість eval
запропонованої в одній з відповідей.
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. значення Function
заповіту буде різним у різних кадрах, тому воно буде працювати лише з одним програмою кадру належним чином. Ось чому ми зазвичай використовуємо typeof
замість цього. Зауважте, що в деяких середовищах можуть бути і аномалії typeof f
, наприклад, за допомогою MSIE 6-8, деякі функції, наприклад, alert
мали тип "об'єкт".
За допомогою локальних функцій ви можете використовувати ту, що приймається у відповіді. Ви можете перевірити, локальна чи глобальна функція.
if (typeof(f) == "function")
if (global.f === f)
console.log("f is a global function");
else
console.log("f is a local function");
Щоб відповісти на запитання, приклад код працює для мене без помилок в останніх веб-переглядачах, тому я не впевнений, у чому була проблема з цим:
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Примітка. Я б використав callback !== undefined
замість цього callback != null
, але вони роблять майже те саме.
Більшість якщо не всі попередні відповіді мають побічні ефекти, щоб викликати функцію
тут найкраща практика
у вас є функція
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');
Якщо ви хочете змінити функції, найкраще використовувати функціональні змінні, визначені в порядку їх виникнення, оскільки функції визначаються в усьому світі, незалежно від місця їх виникнення.
Приклад створення нової функції, яка викликає попередню функцію з тим самим іменем:
A=function() {...} // first definition
...
if (typeof A==='function')
oldA=A;
A=function() {...oldA()...} // new definition
Це працювало для мене
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
Однорядне рішення:
function something_cool(text, callback){
callback && callback();
}