相关疑难解决方法(0)

循环内的JavaScript闭包 - 简单实用的例子

var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value: " + i);
  };
}
for (var j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}
Run Code Online (Sandbox Code Playgroud)

它输出这个:

我的价值:3
我的价值:3
我的价值:3

而我希望它输出:

我的价值:0
我的价值:1
我的价值:2


使用事件侦听器导致运行函数的延迟时,会出现同样的问题:

var buttons = document.getElementsByTagName("button");
// let's create 3 …
Run Code Online (Sandbox Code Playgroud)

javascript closures loops

2689
推荐指数
25
解决办法
34万
查看次数

JavaScript回调函数中的变量范围

我希望下面的代码警告"0"和"1",但它会两次警告"2".我不明白原因.不知道这是不是jQuery的问题.另外,如果这些帖子的标题和标签不准确,请帮我编辑标题和标签.

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function() {
                for (var i=0; i<2; i++) {
                    $.get('http://www.google.com/', function() {
                        alert(i);
                    });
                }
            });
        </script>
    </head>
    <body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

javascript jquery

19
推荐指数
2
解决办法
2万
查看次数

将变量传递给Node.js中的回调

我对节点很新,我正在尝试创建一些获取服务器信息的东西.但这是我的问题.我设置了一个配置对象(这将及时,由发生的事件动态更新),然后在函数中,我尝试访问该对象中的值.(见下面的代码)

首先,我设置我的变量:

var util            = require('util'),
    child           = require('child_process'),
    config          = {};
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.然后我加载我的配置:

function loadConfig( )
{
    // Add some code for auto-loading of args
    config = {
        "daemons": [
            ["Apache", "apache2"],
            ["MySQL",  "mysqld"],
            ["SSH", "sshd"]
        ]
    };
}
Run Code Online (Sandbox Code Playgroud)

并初始化调用该函数

loadConfig();
Run Code Online (Sandbox Code Playgroud)

之后,我对守护进程进行检查.

function getDaemonStatus( )
{
    for(var i=0; i<config.daemons.length; i++)
    {

        child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
            config.daemons[i][1] + '\'")) print $0}\'',
            function( error, stdout, stderr )
        {

            console.log(config.daemons[i]); …
Run Code Online (Sandbox Code Playgroud)

javascript global node.js

9
推荐指数
1
解决办法
4369
查看次数

将值传递给onclick

如果我使用循环创建大量HTML元素,比如

for (i= 1; i < 100; i++) {
    var my_element = document.createElement ("td");
    row.appendChild (my_element);
    my_element.onclick = function () {my_function (i));
}
Run Code Online (Sandbox Code Playgroud)

然后当单击该元素时,传递给的i的值my_function始终为100,无论调用它的是哪个数字元素.我通过使用解决了这个问题

my_element.id = "something"+i;
my_element.onclick = function (e) {my_function (e.target.id)};
Run Code Online (Sandbox Code Playgroud)

(对于Internet Explorer,显然target需要srcElement.)我很想知道是否有任何方法可以创建函数而无需像这样添加ID到元素.

javascript closures loops

7
推荐指数
1
解决办法
2969
查看次数

当lambda函数引用封闭循环中的变量时,javascript范围问题

关于stackoverflow的第一个问题:)希望我不会让自己难堪......

我有一个javascript函数,可以加载一个专辑列表,然后为每个专辑创建一个列表项.列表项应该是可点击的,所以我用一个做东西的函数调用jQuery的click().我循环这样做.我的问题是,所有项目似乎都获得相同的点击功能,即使我尝试创建一个在每次迭代中执行不同内容的新项目.另一种可能性是迭代变量以某种方式是全局的,并且函数引用它.代码如下.debug()只是Firebug的console.debug()的封装.

function processAlbumList(data, c) {
 for (var album in data) {
  var newAlbum = $('<li class="albumLoader">' + data[album].title + '</li>').clone();
  var clickAlbum = function() {
   debug("contents: " + album);
  };
  debug("Album: " + album + "/" + data[album].title);
  $('.albumlist').append(newAlbum);
  $(newAlbum).click(clickAlbum);
 }
}
Run Code Online (Sandbox Code Playgroud)

以下是上述函数运行时打印内容的记录,之后是单击不同项目导致的一些调试行.它总是打印"10",这是专辑变量的最后一个值(有10张专辑).

Album: 0/Live on radio.electro-music.com
Album: 1/Doodles
Album: 2/Misc Stuff
Album: 3/Drawer Collection
Album: 4/Misc Electronic Stuff
Album: 5/Odds & Ends
Album: 6/Tumbler
Album: 7/Bakelit 32
Album: 8/Film
Album: 9/Bakelit
Album: 10/Slow Zoom/Atomic Heart
contents: 10
contents: …
Run Code Online (Sandbox Code Playgroud)

javascript scope function

7
推荐指数
1
解决办法
4811
查看次数

Javascript:将自定义参数传递给回调函数

我有这个回调函数设置:

var contextMenu = [];
var context = [ { "name": "name1", "url": "url1" }, {"name": name2", "url: "url2" } ];
for(var i=0; i < context.length; i++) {
    var c = context[i];
    var arr = {};
    arr[c.name] = function() { callback(c.url); }
    contextMenu.push( arr );
}
function callback(url) {
   alert(url);
}
Run Code Online (Sandbox Code Playgroud)

问题是传递给回调的url值始终是上下文变量中的最后一个值 - 在本例中为"url2".我期望将特定值传递给回调的每个"实例",但由于回调似乎记住了相同的值,因此最后一次引用它.

我有点卡住了.任何帮助,将不胜感激.

PS:我正在使用jQuery ContextMenu,根据我的理解,它不支持将自定义数据发送到其回调函数.正是在这种背景下,我遇到了这个问题.在这种环境下要克服的任何建议也很有帮助!

javascript closures loops callback

6
推荐指数
1
解决办法
5161
查看次数

JavaScript闭包和变量范围

我在JS闭包时遇到问题:

// arg: an array of strings. each string is a mentioned user.
// fills in the list of mentioned users. Click on a mentioned user's name causes the page to load that user's info.
function fillInMentioned(mentions) {
    var mentionList = document.getElementById("mention-list");
    mentionList.innerHTML = "";
    for (var i = 0; i < mentions.length; i++) {
        var newAnchor = document.createElement("a");

        // cause the page to load info for this screen name
        newAnchor.onclick = function () { loadUsernameInfo(mentions[i]) };

        // give this …
Run Code Online (Sandbox Code Playgroud)

javascript events dom closures

3
推荐指数
1
解决办法
1675
查看次数

创建具有值参数而不是引用的函数引用

我不确定如何描述我想要的东西.我想定义一个函数,其参数是本地VALUE而不是引用.

说我有我想要创建的对象列表

for(i = 0; i < 10; i++){
  var div = document.createElement("div");
  div.onclick = function(){alert(i);};
  document.appendChild(div);
}
Run Code Online (Sandbox Code Playgroud)

现在我相信这个例子,无论我点击什么div,它都会提醒"10"; 因为那是变量i的最后一个值;

有没有办法/如何创建一个函数,参数是我在指定函数时的值...如果这有意义的话.

javascript closures function parameter-passing

3
推荐指数
1
解决办法
350
查看次数

在setTimeout函数方法中使用具有更改值的变量?

如果我以错误的角度来到这个街区,请告诉我.我有一系列功能,我想要启动,我希望能够将它们全部设置为循环.

for(var jj = 0; jj<monster.frames.length;jj++){
    setTimeout(
        functionName(jj),
        1000*jj
    );
}
Run Code Online (Sandbox Code Playgroud)

问题在于,当它functionName(jj)被执行时,它被传递的值在jj此时已被更改为最后一个循环迭代值.

javascript

2
推荐指数
1
解决办法
5400
查看次数