简体   繁体   中英

My Javascript code doesn't work anymore after I wrap it in a self-calling function

I see in a lot of code that people wrap everything in a self-calling function so everything stays more or less private. Doing this to my code resulted in it not working anymore.

I Googled a bit about it and saw that it is good practice to place the whole source file in a self-calling function so I decided to try it too. I tried this with my little piece of code and it just doesn't work anymore after doing it.

(function($) {
    const auth = firebase.auth();

    function logIn(){
        window.alert("pressed log in button");
        var userEmail = document.getElementById("txtEmail").value;
        var userPass = document.getElementById("txtPassword").value;

        auth.signInWithEmailAndPassword(userEmail,userPass).catch(function(error) {
            // Handle Errors here.
            var errorCode = error.code;
            var errorMessage = error.message;
            window.alert("Error : " + errorMessage);
        });
    };
});

I expected the code to work but whenever I press the button that calls the logIn function I get the following error message: "Uncaught ReferenceError: logIn is not defined at HTMLButtonElement.onclick". This clearly shows that turning my code into a self-calling function makes it not work anymore.

after I wrap it in a self-calling function

You haven't wrapped it in an IIFE. You've wrapped it in a function which is never called. To make it an IIFE you need to call it (eg with (whatever_you_want_assigned_to_the_$_argument) at the end).

I Googled a bit about it and saw that it is good practice to place the whole source file in a self-calling function

This is because globals are bad. (That's a generalisation).

Uncaught ReferenceError: logIn is not defined at HTMLButtonElement.onclick

Since you don't assign any event handlers in your code, presumably your HTML looks like:

onclick="logIn()"

You are trying to call logIn , as a global.

Now, since the whole point of using an IIFE is to stop using globals , that doesn't work.

Bind your event handlers with addEventListener , or (since you seem to be using jQuery) the jQuery wrapper around that instead.

 (function($) { function logIn(){ window.alert("pressed log in button"); } $("button#logIn").on("click", logIn); })(jQuery); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button id=logIn>Log In</button> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM