Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript";这";不在上下文中,而是指窗口_Javascript_Jquery_Object_Self - Fatal编程技术网

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

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

我遇到了一种情况,一个函数调用另一个函数,改变了“this”的上下文。在“check”函数中,我在变量“self”中添加了“check”以尝试对此进行补偿,同时添加了“alert”以确保“self”显示[object object](它是),但当我将“self”传递给“recurse”函数时,使用一个alert,我可以看到键变为[object Window],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>");
        }
    }
};
$。每个(数据,检查);
功能检查(键,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>");
            }
        }
    };