无法将项添加到数组

时间:2014-02-16 10:33:04

标签: javascript jquery

我正在尝试向数组添加项目,但我似乎无法实现它。如果我不包含“this.results.push(res)”,结果将显示在我的html页面中,但如果包括它则没有任何反应!你能帮忙吗?

这是我当前的代码:

var results = [];

var fun1 = function(str1) {

    var imag = new Image;
    var starttimer = new Date().getTime();


    $(imag).attr('src', str1 + ':8886/').error(function () {
        var endtimer = new Date().getTime();
        res = (endtimer - starttimer);
        this.results.push(res);
        $('#results').html("" + res + "ms");
    });
}

3 个答案:

答案 0 :(得分:2)

您需要更改:

this.results.push(res);

为:

results.push(res);

答案 1 :(得分:1)

你必须使用'results.push(res)'而不是'this.results.push(res)'的原因是'this'的上下文已经改变,并且它没有指向全局上下文任何更多(定义结果数组)。 相反,这指向触发错误事件的图像元素。 另请注意'fun1'的'this'上下文将取决于调用对象。如果在全局范围内调用它,那么将定义'this.results',否则它将是未定义的(在fun1的范围内)。此外,这还取决于函数是在“严格”还是“非严格”模式下定义的事实。

假设您有三个不同的图像元素,并且所有函数中的相同错误事件处理程序“this”在所有函数中都会有所不同。实际上在每个函数中,“this”将对应于触发错误事件(image1,image2或image3)的DOM元素,因为Felix Kling已在评论中写入。

另外,我想指出你实际上可以有一个有效的错误事件处理函数,其中'this.results'可以工作。要实现这一点,您必须使用'call','apply'或'bind'方法调用错误事件处理函数,这些方法允许您更改函数内部的上下文。

你可以说:

// define your onError event handler
var onError = function () {
    var endtimer = new Date().getTime();
    res = (endtimer - starttimer);
    this.results.push(res);
    $('#results').html("" + res + "ms");
};

// now call it this way
$(imag).attr('src', str1 + ':8886/').error(onError.bind(this));

当然,这种方式使用'this'你无法访问你的图像属性,因为它的上下文已经改变了(在你的例子中你没有使用图像属性,所以这里没有坏处。)

为了更好地理解javascript全局和函数上下文,请在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this上阅读更多内容。

希望这有帮助。

答案 2 :(得分:0)

当您在代码浏览器中包含this.results.push(res);时,该行停止并且不继续执行后续字符串。在该回调函数中未定义this.results(检查浏览器的状态栏是否有异常通知)。删除该行时,所有内容都很好,$('#results').html("" + res + "ms");命令会在您的html中显示数据。

使用results.push(res);代替this.results.push(res);,因为results变量是全局变量且可用于回调函数。