JavaScript"这个"不在上下文中,而是指代窗口

时间:2015-05-06 19:35:50

标签: javascript jquery object self

我有一种情况,其中一个函数正在调用另一个函数来改变"这个"正在使用。在"检查"功能我已添加到变量' self'试图弥补这一点,以及"警报"确保" self"显示[对象对象](它是),但当我通过" self"到了"递归"函数,使用警报我可以看到该键变为[对象窗口]并且val变为未定义。我不能为我的生活弄清楚如何解决这个问题...

$.each(data, check);

function check(key, val){
    var self = this;
    if (self.group == "whatever"){
        alert(self);
        recurse(self);
    }
}

function recurse(key, val) {
    if (val instanceof Object) {
        if (this.hasOwnProperty('subNav')) {
            items.push("<li class='" + this.n_class + "'><a target='" + this.target + "' href='" + this.link + "'>" + this.name + "</a>");
            items.push("<ul>");
            $.each(this.subNav, recurse);
            items.push("</ul></li>");
        }
        else {
            items.push("<li class='" + this.n_class + "'><a target='" + this.target + "' href='" + this.link + "'>" + this.name + "</a></li>");
        }
    }
};

3 个答案:

答案 0 :(得分:1)

您可以使用javascript函数callapply。有关详细信息,请参阅此答案https://stackoverflow.com/a/9812721/909535

recurse.call(this); 

答案 1 :(得分:0)

Your using the this keyword。 在函数this中,默认情况下将引用全局对象;在浏览器中,这是window

我已稍微修改了您的代码以修复您的问题但未经过测试。

$.each(data, parse);

function parse(key, val) {
    if (val instanceof Object) {
    items.push("<li class='" + val.n_class + "'><a target='" + val.target + "' href='" + val.link + "'>" + val.name + "</a>");
        if (val.hasOwnProperty('subNav')) {
            items.push("<ul>");
            $.each(val.subNav, parse);
            items.push("</ul>");
        }
    items.push("</li>");
    }
};

答案 2 :(得分:0)

我明白了。我只是需要&#34;这个&#34;引用相同的对象,所以我删除了&#34;键&#34;和&#34; val&#34;来自recurse()的参数并将val内部更改为&#34;此&#34;以及使用&#34; recurse.call(this)&#34;来调用check()内部的recurse。 (*见下文)

$.each(data, check);
function check(key, val){
    if (this.group == "whatever"){
        recurse.call(this); //*****first change
    }
}

function recurse() { //****removed parameters
    if (this instanceof Object) { //**** changed "val" to "this"
        if (this.hasOwnProperty('subNav')) {
            items.push("<li class='" + this.n_class + "'><a target='" + this.target + "' href='" + this.link + "'>" + this.name + "</a>");
            items.push("<ul>");
            $.each(this.subNav, recurse);
            items.push("</ul></li>");
        }
        else {
            items.push("<li class='" + this.n_class + "'><a target='" + this.target + "' href='" + this.link + "'>" + this.name + "</a></li>");
        }
    }
};