The concept of JavaScript callback functions utilizing local variables

I'm struggling to articulate this question, but essentially, I have a class called button that should execute the function passed to it when clicked.

button = function(...,callBack) {
    //...
    this._cb = callBack;
}
button.prototype.callBack = function(e) {
    //...
    this._cb();
}

Then elsewhere in the code

//when canvas is clicked
e.target.callBack(e);

(I hope this provides enough context, let me know if more information is required)

The issue arises when I dynamically create buttons with callbacks that rely on data from an array. For example:

for (var i = 0; i < levels.length; i++) {
    buttons[buttons.length] = new button(..., function() {drawLevel(levels[i])});
}

When these buttons are clicked, they try to access 'i' which leads to unexpected behavior. My question is, how can I resolve this issue without resorting to using eval?

Thank you!

Answer №1

I'm a bit confused about your question, but it seems like you might encounter an issue with the value of i in the anonymous function within the loop (it will consistently be levels.length).

To resolve this, you can create a separate scope for each function, where the i in each scope is a duplicate of the i in the loop.

buttons[buttons.length] = new button(..., (function(i){
    return function() {drawLevel(levels[i])};
})(i));

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Leverage a single JavaScript file across all Vue components without the need for individual imports

My project includes a JavaScript file called Constant.js that stores all API names. //Constant.js export default { api1: 'api1', api2: 'api2', ... ... ... } Is there a way to utilize this file without having to impo ...

stop the leakage of CSS and JS from the subtree to the document through the inverse shadow DOM mechanism

My page contains dynamic HTML content that I want to incorporate. The dynamic content consists of only HTML and CSS, without any JavaScript. However, I have some custom global CSS styles and JS logic that need to be implemented along with this dynamic con ...

Setting a scope variable in an isolate scope from a link function can be achieved by accessing the

In my attempt to assign a variable within an isolate scope, I am encountering difficulties accessing the variable set in the linked function. Surprisingly, I can access the controller's variable without any issues. app.directive('myDir', fu ...

Buttons in Datatables fail to appear when using ajax loading

I've been trying to solve this issue for a while now, but I just can't seem to figure it out. According to the documentation, adding initComplete should make the buttons appear, but I am still facing difficulties. Am I overlooking something? I&a ...

Incorporate a unique style designation with jquery's .css() method

Currently, I am facing an issue while working with Animate.css. I am attempting to set the duration, delay, and looping options but it seems like the command is not being applied. Upon investigation, I suspect that the propertyName is not being recognized ...

Adapting Cube Sizes on the Fly Using AngularJS

Trying to create a dynamic cube in Three.js that can be modified based on user input. The connection is established using angular.js: This snippet of HTML code enables users to input and adjust the values: <body> <div id="mainContainer"> ...

Can anyone figure out why this code is not functioning properly? It seems to be targeting the body element and all of

Currently, I am utilizing jqtouch to create a mobile website. In addition to this, I am incorporating a gallery image slider into the website. However, I have encountered an issue where the images do not display when placed between <div id="project_name ...

sketch a portion of a picture on a canvas

My challenge involves a canvas with dimensions of 400 by 400, and an image sized at 3392 by 232. I am looking to crop the first 400 pixels of this image and display them within the canvas. How can I achieve this task? $(document).ready(function () { v ...

Transferring variables from EJS to JavaScript on render (server to client) securely to prevent cross-site scripting vulnerabilities

When passing variables to JavaScript using ejs, the accepted method often looks like this: <script> var foo = <%- JSON.stringify(foo) %>; </script> However, there have been issues with XSS vulnerabilities using this approach. Is there ...

Is there a way to transform a JavaScript array into JSON format in order to use it as the returned data from a RESTful API

Currently, I am exploring how to efficiently convert an array of arrays into a JSON string for retrieval through a RESTful API. On my server, data is fetched from a database in the format: {"user":"some name","age":number ...

What is the best method for transmitting all parameters via a URL?

$(document).ready(function () { $("#submitButton").click(function () { var name = $("#name").val(); var age = $("#age").val(); var gender = $('input:radio[name=gender]:checked').val(); v ...

Creating a new row with a dropdown list upon clicking a button

I want to include a Textbox and dropdown list in a new row every time I click a button. However, I seem to be having trouble with this process. Can someone assist me in solving this issue? Thank you in advance. HTML <table> <tr> ...

What is the best way to retrieve the UTC value of a specific date and time within a particular time zone using JavaScript?

I want to create a Date object with a specific time: "Midnight in Los Angeles on Christmas 2011". Although I've used moment.js, which is good, and moment-timezone, which is even better, neither the default Date class nor moment constructors allow for ...

How to disable annoying browser ad extensions using Javascript

Is there a way to prevent browser add-ons from injecting HTML code? My website built in angularjs is experiencing routing issues due to certain browser add-ons. The following HTML snippet is causing errors in my angularjs: <script async="" src="http:/ ...

Converting Embedded Elements into Arrays

A pre-existing project was handed to me with the following data structure: [ { "key": "username", "value": "" }, { "key": "password", "value": ...

Tips for leveraging async and await within actions on google and API integration

Currently, I am developing an Actions on Google project that utilizes an API. To handle the API calls, I am using request promise for implementation. Upon testing the API call, I observed that it takes approximately 0.5 seconds to retrieve the data. Theref ...

Can the vacant space on an HTML page be determined through calculation?

Could someone please help me figure out the amount of empty space on a html page? https://i.sstatic.net/VXzbz.png Is it possible to determine the area highlighted in red using javascript? Apologies if this question seems trivial. ...

Limit file selection to images using MUI File Input

I am currently using MUI File Input in React for a file input element. The code I have works well, but I would like to restrict this file input to only accept images. How can I achieve this? Here is what I have done so far: const [locationImg, setLoc ...

Provide alternative styling through css in instances where the Google Books API does not provide an image

How can I modify the CSS code to display the author and title of a book when there is no image available from the Google Books API? Currently, users see a custom image linked here, but it's not clear what it represents without the name and author inf ...

Refresh Div/PartialView periodically

I have a function that performs an Ajax call, retrieves a result, and functions perfectly. @foreach (var fighter in Model.Fighters) { @Ajax.ActionLink(fighter.FirstName + " " + fighter.LastName, "ShowResults",new {id = fighter.FighterID }, new AjaxOptions ...