JavaScript";这";不在上下文中,而是指窗口
我遇到了一种情况,一个函数调用另一个函数,改变了“this”的上下文。在“check”函数中,我在变量“self”中添加了“check”以尝试对此进行补偿,同时添加了“alert”以确保“self”显示[object object](它是),但当我将“self”传递给“recurse”函数时,使用一个alert,我可以看到键变为[object Window],val变为未定义。我一辈子都想不出如何解决这个问题JavaScript";这";不在上下文中,而是指窗口,javascript,jquery,object,self,Javascript,Jquery,Object,Self,我遇到了一种情况,一个函数调用另一个函数,改变了“this”的上下文。在“check”函数中,我在变量“self”中添加了“check”以尝试对此进行补偿,同时添加了“alert”以确保“self”显示[object object](它是),但当我将“self”传递给“recurse”函数时,使用一个alert,我可以看到键变为[object Window],val变为未定义。我一辈子都想不出如何解决这个问题 $.each(data, check); function check(key, v
$.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>");
}
}
};
$。每个(数据,检查);
功能检查(键,val){
var self=这个;
如果(self.group==“无论什么”){
警惕(自我);
递归(自我);
}
}
函数递归(键,val){
if(对象的val实例){
if(this.hasOwnProperty('subNav')){
items.push(“”;
项目。推送(“”);
$.each(this.subNav,递归);
项目。推送(“
”);
}
否则{
items.push(“”);
}
}
};
您可以使用javascript函数调用
或应用
。有关更多信息,请参阅此答案
。
在函数中,默认情况下,此
将引用全局对象;在浏览器中,这是窗口
我已经稍微修改了你的代码来修复你的问题,但它没有经过测试
$.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>");
}
};
$。每个(数据,解析);
函数解析(键,val){
if(对象的val实例){
items.push(“”;
if(val.hasOwnProperty('subNav')){
项目。推送(“”);
$。每个(val.subNav,parse);
项目。推送(“
”);
}
项目。推送(“ ”);
}
};
我想出来了。我只需要“this”来引用同一个对象,所以我从recurse()中删除了“key”和“val”参数,并将内部的val改为“this”,以及使用“recurse.call(this)”调用内部的recurse check()
$。每个(数据,检查);
功能检查(键,val){
如果(this.group==“无论什么”){
递归。调用(此);//****第一次更改
}
}
函数recurse(){/***已删除参数
如果(对象的此实例){/****将“val”更改为“this”
if(this.hasOwnProperty('subNav')){
items.push(“”;
项目。推送(“”);
$.each(this.subNav,递归);
项目。推送(“
”);
}
否则{
items.push(“”);
}
}
};
为什么此代码只将一个参数传递给recurse
?您最好使用控制台.log()
而不是警报()
,这样您就可以看到对象的实际情况。为什么要传递此对象的实例,而不仅仅是键,val?问题是您在递归
函数中使用了此
。与此函数一起使用的属性位于何处?
$.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>");
}
};
$.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>");
}
}
};