Am urmat acest ghid pentru a crea un nou JS pentru flash de comunicare.
Codul meu este
function getID( swfID ){
if(navigator.appName.indexOf("Microsoft") != -1){
me = window[swfID];
}else{
me = document[swfID];
}
}
function js_to_as( str ){
me.onChange(str);
}
Cu toate acestea, uneori, mi onChange
nu se incarca. Firebug erori cu
mine.onChange nu este o funcție
Vreau să degrada cu grație, pentru că acest lucru nu este cea mai importantă caracteristică în programul meu. typeof
dă aceeași eroare.
Orice sugestii cu privire la modul de a face sigur că ea există și apoi executa numai onChange
?
(Nici una dintre metodele de mai jos, cu exceptia prinde o lucrare)
Incearca ceva de genul asta:
if (typeof me.onChange !== "undefined") {
// safe to use the function
}
sau mai bine (ca pe UpTheCreek upvoted comentariu)
if (typeof me.onChange === "function") {
// safe to use the function
}
Nu am avut aceasta problema.
if (obj && typeof obj === 'function') { ... }
am aruncat o eroare de referință dacă obj s-a întâmplat să fie nedefinită.
În final, am făcut următoarele:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }
Un coleg mi-a arătat că verificarea dacă-l's a !== 'nedefinit' "și apoi" = = = 'funcția'
este redundant, desigur.
Mai simplu:
if (typeof obj === 'function') { ... }
Mult mai curat si functioneaza foarte bine.
Daca're folosind eval pentru a converti un șir de funcții, și doriți să verificați dacă acest eval'd metoda exista, tu'll doriți să utilizați tip și funcția șir de caractere în interiorul unui evaluare:
var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"
Don't inversa acest lucru și să încerce o tip pe evaluare. Dacă faci o ReferenceError va fi aruncat:
var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
Ce zici de:
if('functionName' in Obj){
//code
}
de exemplu
var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false
sau în cazul tău:
if('onChange' in me){
//code
}
A se vedea MDN docs.
Am't vedea acest lucru sugerat: mine.onChange && me.onChange(str);
Practic, dacă pe mine.onChange este nedefinit (care va fi, dacă nu a't a fost inițiat), atunci nu o't executa ultima parte. Dacă-mi.onChange este o funcție, se va executa mine.onChange(str).
Puteți merge chiar mai departe și de a face:
me && me.onChange && me.onChange(str);
în cazul în care m este asincron la fel de bine.
Încerca typeof
-- caut'nedefinit' să spui că nu - 't exist, `'funcția' pentru o funcție. [JSFiddle pentru acest cod][1]
function thisishere() {
return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);
Sau ca în cazul în care:
if (typeof thisishere === 'function') {
// function exists
}
Sau cu o valoare de retur, pe o singură linie:
var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false
//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");
}
La Underscore.js biblioteca definește în isFunction metodă ca asta (care comentarii sugerează pot satisface unele bug-uri browser)
typeof obj == 'function' || false
Îmi place folosind această metodă:
function isFunction(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
Utilizare:
if ( isFunction(me.onChange) ) {
me.onChange(str); // call the function with params
}
Mi-ar suspecta că " eu " nu este obtinerea corect atribuite onload.
Mutarea get_ID apel în onclick eveniment ar trebui să aibă grijă de ea.
Evident, puteți în continuare capcană așa cum am menționat anterior:
function js_to_as( str) {
var me = get_ID('jsExample');
if (me && me.onChange) {
me.onChange(str);
}
}
Am avut caz în care numele funcției variat în funcție de o variabilă (var 'x' in acest caz) care se adaugă la funcțiile numele. Aceasta funcționează:
if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); }
Am încercat acceptat răspunsul; cu toate acestea:
console.log(typeof me.onChange);
întoarce 'nedefinit'. Am'am observat că, caietul de sarcini prevede un eveniment numit 'onchange' în loc de 'onChange' (observați camelCase).
Schimbarea original acceptat răspunsul la următoarele lucrat pentru mine:
if (typeof me.onchange === "function") {
// safe to use the function
}
function function_exists(function_name)
{
return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));
SAU
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';
}