উত্তর:
typeof callback === "function"
বর্তমানের সমস্ত উত্তর একটি আক্ষরিক স্ট্রিং ব্যবহার করে, যা আমি যদি সম্ভব হয় আমার কোডে না রাখাই পছন্দ করি - এটি (এবং বুট করার জন্য মূল্যবান অর্থপূর্ণ অর্থ প্রদান করে):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
ব্যক্তিগতভাবে, আমি আমার কোডটিতে ঝুলন্ত স্ট্রিংগুলির সংখ্যা হ্রাস করার চেষ্টা করি ...
এছাড়াও, আমি যখন সচেতন যে typeof
এটি একটি অপারেটর এবং কোনও ফাংশন নয়, সিনট্যাক্স ব্যবহারে সামান্য ক্ষতি হ'ল যা এটি পরবর্তী হিসাবে উপস্থিত হয়।
isFunction(not_defined))
যেখানে not_defined
ফাংশনটির নাম যেখানে সংজ্ঞায়িত করা হয়নি এবং ফায়ারব্যাগ ফিরে এসেছে not_defined is not defined
যা সঠিক তবে আপনার ফাংশনটি মিথ্যা ফিরে পাওয়া উচিত এবং ত্রুটি উত্পন্ন করা উচিত নয় ...
not_defined
যাতে তার মানটি পাস করে isFunction()
এটি সমাধান করতে ব্যর্থ হয়। isFunction()
এই সমস্যাটি সমাধানের সংজ্ঞা অনুসারে কিছুই করা যায় না ।
isFunction
এবং ঠিক করুন (typeof no_function == typeof Function)
।
typeof(Function())
কারণ ফাংশন একটি ফাংশন; তবে অ্যারে, অবজেক্ট এবং অন্যান্য অন্তর্নির্মিত প্রোটোটাইপগুলি (আরও ভাল শর্তের অভাবে) are যদি আপনি কোনও অ্যারে পরীক্ষা করে থাকেন তবে typeof(array) === typeof(Array)
উদাহরণস্বরূপ আপনি ব্যবহার করবেন না ; আপনি typeof(array) === typeof(Array())
সতর্কতা ও ধারাবাহিকতা বজায় রাখলে আপনাকে অবশ্যই ফাংশনটি মূল্যায়ন করতে হবে কারণ আপনি ব্যবহার করবেন ।
if (callback && typeof(callback) == "function")
মনে রাখবেন যে, কলব্যাক (নিজে) মূল্যায়ণ করতে false
এটা হলে undefined
, null
, 0
, অথবা false
। তুলনা null
অত্যধিক নির্দিষ্ট।
callback
নিজে কোনও "মিথ্যা-ওয়াই" মানকে মূল্যায়ন করে তবে এর টাইপটি কখনও "ফাংশন" হতে পারে না ।
কোনও ফাংশন বাস্তবায়িত হয়েছে কিনা তা জানাতে সেই পদ্ধতিগুলি যদি ভেরিয়েবল সংজ্ঞায়িত না হয় তবে ব্যর্থ হয় তাই আমরা আরও শক্তিশালী এমন কিছু ব্যবহার করছি যা একটি স্ট্রিং প্রাপ্তিকে সমর্থন করে:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
পরিবর্তে উল্লেখ করুন doesthisexist
। তবে প্রদর্শিত হিসাবে ইওল (যা: মন্দ) ব্যবহার করা কেবলমাত্র নামযুক্ত ফাংশনগুলির সাথে কাজ করবে - এটি প্রশ্নের ক্ষেত্রে ব্যবহারের ক্ষেত্রে কাজ করবে না।
জাভাস্ক্রিপ্টে নতুন আমি আচরণের পরিবর্তন হয়েছে কিনা তা নিশ্চিত নই তবে জেসন বুটিং (years বছর আগে) প্রদত্ত সমাধানটি সম্ভব ফাংশনটি সংজ্ঞায়িত না হলে কাজ করবে না।
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
ReferenceError: possibleFunction is not defined
ইঞ্জিন সম্ভাব্য প্রতীকটি সমাধান করার চেষ্টা করার সাথে সাথে এটি একটি ত্রুটি ছুঁড়ে ফেলবে (জেসনের উত্তরের মন্তব্যে উল্লিখিত)
এই আচরণটি এড়াতে আপনি কেবলমাত্র ফাংশনটির নামটি পাস করতে পারেন আপনি এটির উপস্থিতি আছে কিনা তা যাচাই করতে চান। সুতরাং
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
এটি কোনও ভেরিয়েবলকে আপনি যে ফাংশনটি যাচাই করতে চান তা হতে হবে বা খালি অবজেক্টটি যদি এটি সংজ্ঞায়িত না করা হয় এবং তাই উপরে বর্ণিত সমস্যাগুলি এড়িয়ে চলে sets
চেষ্টা করুন:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
? :)
typeof
জাভাস্ক্রিপ্টের নতুন / ভিন্ন প্রয়োগের কারণে স্ট্রিং আক্ষরিক সহ কোডটি ব্যবহার করেছি এবং পরে কিছু আলাদা (সম্ভবত "ফাংশন" এর পরিবর্তে "ফাংশন") ফেরানোর জন্য কলটি ব্যবহার করেছে - মনে হচ্ছে এর কম সম্ভাবনা কম হবে বলে মনে হয় একটি নতুন / পৃথক বাস্তবায়ন typeof Function === typeof callback
চেকটি ভেঙে দেবে কারণ এটি শব্দার্থক স্তরে একই হওয়া উচিত।
typeof(callback) == "function"
আমি করতে পারে
try{
callback();
}catch(e){};
আমি জানি একটি গ্রহণযোগ্য উত্তর আছে, কিন্তু কেউ এটি প্রস্তাব করেনি। আমি এই সত্যবাদী এর বিবরণ ফিট করে কিনা তা নিশ্চিত না, তবে এটি সব ক্ষেত্রেই কাজ করে।
আরও নতুন জাভাস্ক্রিপ্ট ইঞ্জিনগুলির finally
পরিবর্তে একটি ব্যবহার করা যেতে পারে।
typeof callback
যেভাবেই ব্যবহার করি ।
accepted_types.indexOf(typeof value) !== -1
এটি বিভিন্ন ধরণের রয়েছে কিনা তা পরীক্ষা করে দেখুন। এই পরিস্থিতিতে আমার মতে ব্যতিক্রমগুলি নিষিদ্ধ হবে।
এটা চেষ্টা কর:
callback instanceof Function
আপনি যদি http://outscorejs.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
পাশাপাশি ব্যবহার করতে পারেন , কিন্তু আফাইক। এর মান Function
বিভিন্ন ফ্রেমে আলাদা হবে, সুতরাং এটি কেবলমাত্র একক ফ্রেমের অ্যাপ্লিকেশন সহ সঠিকভাবে কাজ করবে। এজন্য আমরা সাধারণত typeof
পরিবর্তে ব্যবহার করি । মনে রাখবেন যে কিছু পরিবেশে typeof f
খুব অসাধারণতাও থাকতে পারে যেমন, এমএসআইই 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();
}