답변:
typeof callback === "function"
현재의 모든 답변은 리터럴 문자열을 사용합니다. 가능한 경우 코드에없는 것을 선호합니다.
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
개인적으로 코드에 걸려있는 문자열 수를 줄이려고합니다 ...
또한 typeof
함수가 아니라 연산자 라는 것을 알고 있지만 구문을 사용하면 후자로 표시되는 데 거의 해가 없습니다.
isFunction(not_defined))
곳 not_defined
정의되지 않은 함수의 이름이고 불을 지르고 반환 not_defined is not defined
정확하다 ...하지만 기능은 오류가 발생 false를 반환하지해야하는
not_defined
값을 전달하기 위해 기호를 해석하려고 시도하고 해석하지 못하기 때문에 내 대답에 표시된 함수는 오류가 발생하는 것처럼 오류를 반환하지 않습니다 isFunction()
. isFunction()
이 문제를 해결하기 위해 정의를 수행 할 수있는 것은 없습니다 .
isFunction
그냥하십시오 (typeof no_function == typeof Function)
.
typeof(Function())
Function이 함수이기 때문에 실제로 사용해야합니다 . 그러나 더 나은 용어가없는 배열, 객체 및 기타 내장 프로토 타입도 마찬가지입니다. 배열을 확인하는 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를 처음 접했을 때 동작이 변경되었는지 확실하지 않지만 가능한 경우 기능이 정의되어 있지 않으면 Jason Bunting (6 년 전)이 제공 한 솔루션이 작동하지 않습니다.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
ReferenceError: possibleFunction is not defined
엔진이 possibleFunction 기호를 해결하려고 시도 하면 오류가 발생합니다 (Jason의 답변에 대한 주석에서 언급 한 바와 같이)
이 동작을 피하려면 검사하려는 기능의 이름 만 전달하면됩니다. 그래서
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
변수를 확인하려는 함수 또는 정의되지 않은 경우 빈 개체로 설정하므로 위에서 언급 한 문제를 피할 수 있습니다.
시험:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
? :)
typeof
은 - 때문에 자바 스크립트의 새 / 다른 구현으로, 나중에 반환 뭔가 다른 (대신 "기능"어쩌면 "기능") 느낌 이 덜하는 것처럼 새로운 / 다른 구현은 typeof Function === typeof callback
의미 수준에서 동일해야하기 때문에 검사를 중단합니다 .
나는 할지도 모른다
try{
callback();
}catch(e){};
나는 대답이 받아 들여진다는 것을 알고 있지만 아무도 이것을 제안하지 않았다. 이것이 관용구의 설명에 맞는지 확실하지 않지만 모든 경우에 작동합니다.
최신 JavaScript 엔진에서는 a 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');
이것은 나를 위해 일했다
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
단선 솔루션 :
function something_cool(text, callback){
callback && callback();
}