我有一种情况,其中一个函数正在调用另一个函数来改变"这个"正在使用。在"检查"功能我已添加到变量' 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>");
}
}
};
答案 0 :(得分:1)
您可以使用javascript函数call
或apply
。有关详细信息,请参阅此答案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>");
}
}
};