2
votes

Nom de la fonction introuvable en raison d'une erreur de référence

J'obtiens l'erreur suivante dans la console:

$(document).ready(function jason() {

    console.log("test");    
});   

var addEvent = function(object, type, callback) {
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } 
};


addEvent(window, "resize", jason());

Voici mon javascript:

Uncaught ReferenceError: jason is not defined

Merci beaucoup pour le aide!


3 commentaires

comment écrirais-je cela si je veux juste appeler la fonction jason ()?


Notez que même si jason était accessible à ce stade, ce ne serait pas jason que vous passeriez comme callback , mais sa valeur de retour (c'est-à-dire undefined ).


prenez le corps de la fonction à l'extérieur de ready () et placez-le ailleurs. vous pouvez simplement l'appeler par son nom à l'intérieur du prêt alors. comme $ (document) .ready (jason ());


5 Réponses :


4
votes

Quand vous le mettez dans $ (document) .ready () , il n'est pas disponible en dehors de cette fonction. Rendez-le global et définissez-le sans $ (document) .ready () , mais cela fonctionnera même avant le chargement de la page.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
function jason() {

    console.log("test");    
};   

var addEvent = function(object, type, callback) {
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } 
};


addEvent(window, "resize", jason());


0 commentaires

0
votes

Jason est mal défini. Vérifiez simplement le code ci-dessous, définissez d'abord une fonction, puis appelez-la.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
$(document).ready(function() {
    addEvent(window, "resize", jason());

    console.log("test");    
});   

var addEvent = function(object, type, callback) {    
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } 
};

   function jason(){
    console.log("call jason function");
  }


0 commentaires

2
votes

En Javascript, il existe de nombreuses façons de définir des fonctions. Cependant, elles se divisent généralement en deux catégories: les déclarations de fonction et les expressions de fonction.

Les déclarations de fonction ressemblent à ceci:

// Not what you want
$(document).ready(jason());
addEvent(window, "resize", jason());   

Une déclaration de fonction a global scope quel que soit son emplacement dans le code, et il peut être appelé plus tôt dans le programme que là où il est défini. ( Edit: en fait, si une déclaration de fonction est imbriquée dans une autre fonction, elle ne peut être appelée que dans cette fonction externe )

Expressions de fonction look comme ceci:

$(document).ready(jason);
addEvent(window, "resize", jason);   

Ils ont une portée comme toute autre variable. Ils doivent être définis avant de pouvoir être appelés.

Dans votre cas , vous avez créé jason () comme expression de fonction, mais ne l'avez pas attribué à une variable. Vous l'avez nommé jason , mais ce nom ne fonctionne qu'à l'intérieur de la fonction (comme pour la récursivité), pas ailleurs. Si vous deviez utiliser uniquement la fonction jason () comme argument de $ (document) .ready () , alors définir comme vous l'avez fait serait correct. Mais comme vous semblez vouloir utiliser jason () à plus d'un endroit, vous devez soit 1) changer une déclaration de fonction ou 2) en faire une expression de fonction qui est assignée à une variable avant d'être passé à $ (document) .ready () et addEvent().

D'ailleurs, lors du passage d'une fonction en argument, vous devez laisser les parenthèses, comme ceci:

// Anonymous function expression set to a variable
let jason = function() {
    console.log("test");    
};

// Named function expression set to a variable
let jason = function freddy() {
    console.log("test");    
};

Si vous faites ce qui suit à la place, il exécutera jason () et passera la valeur il revient à chacune de ces fonctions. Dans ce cas, cette valeur serait non définie.

function jason() {
    console.log("test");    
}


1 commentaires

Re "Une déclaration de fonction a une portée globale quel que soit son emplacement dans le code" - les fonctions imbriquées ne sont pas rendues globales. Bon point que le rappel à passer est jsan et non jsan ()



1
votes

Des expressions de fonction peuvent être données un nom, mais comme indiqué dans le lien MDN, le nom n'est disponible que dans le corps de la fonction.

Les déclarations de fonction qui font hisser une fonction nommée au sommet de la fonction ou de l'élément de script dans lequel elles résident sont également function instructions .

Nommer et fournir le code pour jsan comme valeur d'argument pour un appel à ready empêche qu'il soit traité comme une instruction et crée une expression de fonction.

Évidemment, si vous souhaitez appeler ou référencer la fonction jsan à plusieurs endroits, elle doit être déclarée dans la portée de partout où elle est référencée - ce qui pourrait nécessiter la création d'un fonction ou en la déclarant dans une fonction externe commune, selon la structure du code.


0 commentaires

0
votes

Vous pouvez écrire votre code uniquement dans le document .ready function ().

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  

$(document).ready(function(){
console.log("test");
})

var addEvent = function(object, type, callback) {
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } 
};


addEvent(window, "resize");


0 commentaires