1

似乎我的函数在单击后无法正确显示控制台日志中的名称,因为我正在尝试正确实现。它给了我这里显示的这个未定义的错误: 在此处输入图像描述

但是,它出错的代码 "response.data[i]" 正确显示在锚标记的 html 端,如代码(来自下面的链接)和此屏幕截图所示:

在此处输入图像描述

那么,当单击以拆分控制台日志中的名称时,它是如何未定义的,但在显示时显然可以工作?还有 console.log(response.data); 命令清楚地显示 response.data ,如下所示:

在此处输入图像描述

因此,我只是不知道如何解决此问题以在单击后正确显示控制台日志中的名称,无论是 2 字名称还是 3 字名称。

代码:

function getGroupWall() {
    $("#groupUL").html("");
    FB.api('/421727124532461/feed', 'get', function(response){
        console.log(response.data);
        for (i=10, j=response.data.length; i<=j; i++) {
            function splitName(txt){
                var myString = txt;

                var mySplitResult = myString.split(" ");

                console.log("The first element is " + mySplitResult[0]); 
                console.log("<br /> The second element is  " + mySplitResult[1]); 
                console.log("<br /> The third element is  " + mySplitResult[2]); 

            };
            $("#groupUL").append("<li>" + "<h4>Item Description:</h4> " + response.data[i].message + "<br /> " + "<h2>Posted By:</h2> <a href='#' id='splitNames'>" + response.data[i].from.name + "</a>" + "<br />"+ "<h4># of Replys: </h4>" + response.data[i].comments.count + "<br />" +  "<a href='" + response.data[i].link + "' target='new' style='text-align:right;'>(external url)</a>" + "<br /> " + "<img src='"+response.data[i].picture+"'>" + "</li><br />");
            $("#splitNames").click(function(){ splitName(response.data[i].from.name) });
        }
    });
}
4

1 回答 1

3

这是一个典型的闭包问题。

的值i将是response.data.length处理click程序触发的时间。

您必须像这样绑定i

$("#splitNames").click((function (i) { // extra "(" indicating immediate invocation
    // return an anonymous function that has a value for "i" in it's scope
    return function (event) { // event is the click event, or whatever is usually passed to it
        splitName(response.data[i].from.name)
    }
}(i))); // immediate invocation to bind "i"

你也可以这样做:

$("#splitNames").click((function (item) {
    return function (event) {
        splitName(item.from.name)
    }
}(response.data[i])));

我希望这可以帮助您了解闭包的工作原理。

于 2013-03-27T14:35:33.130 回答