JavaScript 함수가 정의되었는지 확인하는 방법
-
01-07-2019 - |
문제
JavaScript의 함수가 정의되었는지 어떻게 알 수 있나요?
나는 이런 것을하고 싶다
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
하지만 그것은 나에게
콜백은 함수가 아닙니다
콜백이 정의되지 않은 경우 오류가 발생합니다.
해결책
typeof callback === "function"
다른 팁
현재의 모든 답변은 리터럴 문자열을 사용합니다. 가능하면 코드에 포함하지 않는 것을 선호합니다. 그렇지 않습니다(부팅할 때 귀중한 의미상 의미를 제공합니다).
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
개인적으로 저는 코드에 남아 있는 문자열 수를 줄이려고 노력합니다.
또한, 내가 그 사실을 알고 있는 동안 typeof
는 함수가 아니라 연산자이므로 후자처럼 보이게 만드는 구문을 사용해도 해가 거의 없습니다.
if (callback && typeof(callback) == "function")
콜백 자체는 다음과 같이 평가됩니다. false
그렇다면 undefined
, null
, 0
, 또는 false
.비교 null
지나치게 구체적이다.
함수가 구현되었는지 확인하는 메서드는 변수가 정의되지 않은 경우에도 실패하므로 문자열 수신을 지원하는 보다 강력한 방법을 사용하고 있습니다.
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
JavaScript를 처음 접했을 때 동작이 변경되었는지 확실하지 않지만, availableFunction이 정의되지 않은 경우 Jason Bunting(6년 전)이 제공한 솔루션이 작동하지 않습니다.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
이것은 ReferenceError: possibleFunction is not defined
엔진이 availableFunction 기호를 해결하려고 할 때 오류가 발생합니다(Jason의 답변에 대한 설명에서 언급했듯이).
이 동작을 방지하려면 함수가 존재하는지 확인하려는 함수의 이름만 전달하면 됩니다.그래서
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
이렇게 하면 변수를 확인하려는 함수로 설정하거나 정의되지 않은 경우 빈 개체로 설정하므로 위에서 언급한 문제를 피할 수 있습니다.
노력하다:
if (typeof(callback) == 'function')
나는 할 수도 있다
try{
callback();
}catch(e){};
나는 받아들여지는 대답이 있다는 것을 알고 있지만 아무도 이것을 제안하지 않았습니다.이것이 관용적이라는 설명에 맞는지는 잘 모르겠지만 모든 경우에 적용됩니다.
최신 JavaScript 엔진에서는 finally
대신 사용할 수 있습니다.
if ('function' === typeof callback) ...
typeof(callback) == "function"
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
이 시도:
callback instanceof Function
당신이 보면 원천 @Venkat Sudheer Reddy Aedama가 언급한 underscorejs 라이브러리에서 다음을 볼 수 있습니다.
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
이것은 단지 내 힌트, 힌트 답변입니다 :>
노력하다:
if (!(typeof(callback)=='undefined')) {...}
당신이 사용하는 경우 http://underscorejs.org, 당신은:http://underscorejs.org/#isFunction
_.isFunction(callback);
jQuery 함수가 정의되어 있는지 확인하는 방법을 찾고 있었는데 쉽게 찾을 수 없었습니다.
필요할 수도 있겠네요 ;)
if(typeof jQuery.fn.datepicker !== "undefined")
만약 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');
한 줄 솔루션:
function something_cool(text, callback){
callback && callback();
}