Mijn code is
function getID( swfID ){
if(navigator.appName.indexOf("Microsoft") != -1){
me = window[swfID];
}else{
me = document[swfID];
}
}
function js_to_as( str ){
me.onChange(str);
}
Soms wordt mijn onChange
echter niet geladen. Firebug-fouten met
me.onChange is geen functie
Ik wil gracieus degraderen omdat dit niet de belangrijkste functie in mijn programma is. typeof
geeft dezelfde fout.
Enige suggesties om ervoor te zorgen dat het bestaat en dan alleen onChange
uit te voeren?
(Geen van de onderstaande methoden behalve proberen één werk te vangen)
Antwoord 1, autoriteit 100%
Probeer zoiets als dit:
if (typeof me.onChange !== "undefined") {
// safe to use the function
}
of beter nog (volgens UpTheCreek upvoted commentaar)
if (typeof me.onChange === "function") {
// safe to use the function
}
Antwoord 2, autoriteit 9%
Ik had dit probleem.
if (obj && typeof obj === 'function') { ... }
bleef een referentiefout geven als obj ongedefinieerd was.
Uiteindelijk heb ik het volgende gedaan:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }
Een collega wees me erop dat controleren of het !== 'undefined'
is en dan === 'function'
natuurlijk overbodig is.
Eenvoudiger:
if (typeof obj === 'function') { ... }
Veel schoner en werkt geweldig.
Antwoord 3, autoriteit 4%
Modern JavaScript om te redden!
In 2021 is dit opgelost* in JavaScript (en TypeScript) met de nieuwe Optionele ketensyntaxis.
me.onChange?.(str)
Als onChange
bestaat, wordt het aangeroepen.
Als onChange
niet bestaat, gebeurt er niets: de expressie retourneert undefined
.
Dus voor let value = me.onChange?.(str)
, wordt value
niet gedefinieerd als onChange
niet bestaat.
p>
Let op, als onChange
bestaat maar geeneen functie is, genereert het een TypeError
net alsof je een niet-functie aanroept als een functie. Optionele Chaining doet geen magie om dit te laten verdwijnen.
* Optionele Chaining is nog steeds een fase 4 TC39-voorstel, dus technisch nog niet in de ECMAScript-specificatie. Maar fase 4 betekent dat het in wezen gegarandeerd wordt opgenomen in de volgende versie. Je kunt de syntaxis vandaag gebruiken via Babel of TypeScript met het vertrouwen dat deze niet zal veranderen.
Antwoord 4
Als je eval gebruikt om een string naar functie te converteren, en je wilt controleren of deze eval’d-methode bestaat, gebruik dan typeofen je functiestring in een eval:
var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"
Keer dit niet om en probeer een typeofop eval. Als je dat doet, wordt er een ReferenceError gegenereerd:
var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
Antwoord 5
Wat dacht je van:
if('functionName' in Obj){
//code
}
bijv.
var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false
of wat uw geval betreft:
if('onChange' in me){
//code
}
Zie MDN-documenten.
Antwoord 6
Probeer typeof
— Zoek naar 'undefined'
om te zeggen dat het niet bestaat, 'function'
voor een functie. JSFiddle voor deze code
function thisishere() {
return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);
Of als een als:
if (typeof thisishere === 'function') {
// function exists
}
Of met een retourwaarde, op een enkele regel:
var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false
Antwoord 7
Heb dit niet voorgesteld:
me.onChange && me.onChange(str);
Als me.onChange ongedefinieerd is (wat het zal zijn als het niet is gestart), zal het het laatste deel niet uitvoeren. Als me.onChange een functie is, zal het me.onChange(str) uitvoeren.
Je kunt zelfs verder gaan en het volgende doen:
me && me.onChange && me.onChange(str);
voor het geval ik ook async ben.
Antwoord 8
Voor mij de gemakkelijkste manier:
function func_exists(fname)
{
return (typeof window[fname] === 'function');
}
Antwoord 9
//Simple function that will tell if the function is defined or not
function is_function(func) {
return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}
//usage
if (is_function("myFunction") {
alert("myFunction defined");
} else {
alert("myFunction not defined");
}
Antwoord 10
Ik ga nog een stap verder om er zeker van te zijn dat de eigenschap inderdaad een functie is
function js_to_as( str ){
if (me && me.onChange && typeof me.onChange === 'function') {
me.onChange(str);
}
}
Antwoord 11
Zet een dubbel uitroepteken, d.w.z. !! vóór de functienaam die u wilt controleren. Als het bestaat, wordt het true geretourneerd.
function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false
Antwoord 12
function js_to_as( str ){
if (me && me.onChange)
me.onChange(str);
}
Antwoord 13
Ik gebruik deze methode graag:
function isFunction(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
Gebruik:
if ( isFunction(me.onChange) ) {
me.onChange(str); // call the function with params
}
Antwoord 14
Ik had het geval waarin de naam van de functie varieerde volgens een variabele (var ‘x’ in dit geval) toegevoegd aan de functienaam. Dit werkt:
if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); }
Antwoord 15
De Underscore.js-bibliotheek definieert het in de isFunction-methode als volgt (waarvan de opmerkingen suggereren dat dit een aantal browserbugs kan verhelpen)
typeof obj == 'function' || false
http://underscorejs.org/docs/underscore.html#section-143
Antwoord 16
Als u zoekt naar een functie die een jQuery-plug-in is, moet u $.fn.myfunction gebruiken
if (typeof $.fn.mask === 'function') {
$('.zip').mask('00000');
}
Antwoord 17
function function_exists(function_name)
{
return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));
OF
function function_exists(func_name) {
// discuss at: http://phpjs.org/functions/function_exists/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// improved by: Steve Clay
// improved by: Legaev Andrey
// improved by: Brett Zamir (http://brett-zamir.me)
// example 1: function_exists('isFinite');
// returns 1: true
if (typeof func_name === 'string') {
func_name = this.window[func_name];
}
return typeof func_name === 'function';
}
Antwoord 18
Zonder voorwaarden
me.onChange=function(){};
function getID( swfID ){
if(navigator.appName.indexOf("Microsoft") != -1){
me = window[swfID];
}else{
me = document[swfID];
}
}
function js_to_as( str ){
me.onChange(str);
}
Antwoord 19
Ik vermoed dat me
niet correct wordt toegewezen aan onload.
Het verplaatsen van de get_ID-aanroep naar de onclick-gebeurtenis zou dit moeten oplossen.
Natuurlijk kun je verder vallen zoals eerder vermeld:
function js_to_as( str) {
var me = get_ID('jsExample');
if (me && me.onChange) {
me.onChange(str);
}
}
Antwoord 20
Ik controleer altijd als volgt:
if(!myFunction){return false;}
plaats het gewoon voor elke code die deze functie gebruikt
Antwoord 21
Deze eenvoudige jQuery-code zou het lukken:
if (jQuery.isFunction(functionName)) {
functionName();
}
Antwoord 22
Ik heb het geaccepteerde antwoord geprobeerd; echter:
console.log(typeof me.onChange);
retourneert ‘undefined’.
Ik heb gemerkt dat de specificatie een gebeurtenis vermeldt met de naam ‘onchange’ in plaats van ‘onChange’ (let op de camelCase).
Het wijzigen van het oorspronkelijk geaccepteerde antwoord in het volgende werkte voor mij:
if (typeof me.onchange === "function") {
// safe to use the function
}
Antwoord 23
Ik ben ook op zoek geweest naar een elegante oplossing voor dit probleem. Na lang nadenken vond ik deze aanpak het beste.
const func = me.onChange || (str => {});
;
func(str)
Antwoord 24
In een paar woorden: vang de uitzondering.
Het verbaast me echt dat nog niemand heeft gereageerd of gereageerd op Exception Catch op dit bericht.
Detail: Hier volgt een voorbeeld waarin ik probeer een functie te matchen die wordt voorafgegaan door mask_ en als achtervoegsel door het formulierveld “name”. Wanneer JavaScript de functie niet vindt, zou het een ReferenceErrormoeten genereren die u naar wens kunt afhandelen in de catch-sectie.
function inputMask(input) {
try {
let maskedInput = eval("mask_"+input.name);
if(typeof maskedInput === "undefined")
return input.value;
else
return eval("mask_"+input.name)(input);
} catch(e) {
if (e instanceof ReferenceError) {
return input.value;
}
}
}
Antwoord 25
Hier is een werkende en eenvoudige oplossing om het bestaan van een functiete controleren en die functie dynamisch te activerendoor een andere functie;
Triggerfunctie
function runDynamicFunction(functionname){
if (typeof window[functionname] == "function") { //check availability
window[functionname]("this is from the function it"); // run function and pass a parameter to it
}
}
en je kunt de functie nu dynamisch genereren, misschien met behulp van php op deze manier
function runThis_func(my_Parameter){
alert(my_Parameter +" triggerd");
}
nu kun je de functie aanroepen met een dynamisch gegenereerde gebeurtenis
<?php
$name_frm_somware ="runThis_func";
echo "<input type='button' value='Button' onclick='runDynamicFunction(\"".$name_frm_somware."\");'>";
?>
de exacte HTML-code die je nodig hebt is
<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">
Antwoord 26
function sum(nb1,nb2){
return nb1+nb2;
}
try{
if(sum() != undefined){/*test if the function is defined before call it*/
sum(3,5); /*once the function is exist you can call it */
}
}catch(e){
console.log("function not defined");/*the function is not defined or does not exists*/
}
Antwoord 27
En dan is er nog dit…
( document.exitPointerLock || Function )();
Antwoord 28
Probeer deze:
Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true;
return false;
}
Houd er rekening mee dat ik dit met mijn mobiel heb geschreven
Kan enkele hoofdletters bevatten en/of andere correcties die nodig zijn, zoals bijvoorbeeld functienaam
Als je wilt dat een functie zoals PHP controleert of de var is ingesteld:
Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}
Antwoord 29
Om de voorgaande antwoorden te illustreren, hier een kort JSFiddle-fragment:
function test () {
console.log()
}
console.log(typeof test) // >> "function"
// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}
// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}
// confirm that the test is effective :
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}
// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}
/* Expected :
function
true
true
false
false
*/
Antwoord 30
Ik raad aan om:
function hasMethod(subject, methodName) {
return subject != null && typeof subject[methodName] == "function";
}
De eerste controle subject != null
filtert nullish-waarden (null
en undefined
) uit die geen eigenschappen hebben. Zonder deze controle zou subject[methodName]
een foutmelding kunnen geven:
TypeError: (undefined|null) heeft geen eigenschappen
Alleen een waarheidswaarde controleren is niet genoeg, aangezien 0
en ""
beide vals zijn, maar wel eigenschappen hebben.
Na validatie dat subject
niet ongeldig is, kunt u veilig toegang krijgen tot de eigenschap en controleren of deze overeenkomt met typeof subject[methodName] == "function"
.
Als u dit op uw code toepast, kunt u nu het volgende doen:
if (hasMethod(me, "onChange")) {
me.onChange(str);
}