Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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 each()作用域问题(bug?)_Javascript_Jquery_Jquery Selectors_Each - Fatal编程技术网

Javascript each()作用域问题(bug?)

Javascript each()作用域问题(bug?),javascript,jquery,jquery-selectors,each,Javascript,Jquery,Jquery Selectors,Each,出于某种原因,我对嵌套jQuery.each()函数的调用正在丢失某些变量的作用域,而不是其他变量的作用域。在下面的代码中,Client.KNE引用起作用,但ClientDiv不起作用,即使在这之前,两者都是定义的、填充的变量 通过将Client和ClientDiv切换到全局变量,它可以工作,但我觉得我不应该在这里创建全局变量 不起作用: jQuery.each(Messages.Additions, function (clientIndex) { var Client = Messa

出于某种原因,我对嵌套jQuery.each()函数的调用正在丢失某些变量的作用域,而不是其他变量的作用域。在下面的代码中,Client.KNE引用起作用,但ClientDiv不起作用,即使在这之前,两者都是定义的、填充的变量

通过将Client和ClientDiv切换到全局变量,它可以工作,但我觉得我不应该在这里创建全局变量

不起作用:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            var KNE = Client.KNE[kneIndex];                       // Works
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // DOES NOT WORK
是否有效:

jQuery.each(Messages.Additions, function (clientIndex) {
    Client = Messages.Additions[clientIndex];
    ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            KNE = Client.KNE[kneIndex];                       // Works
            KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // Works
有人知道我在第一个版本中做错了什么吗?还是这是一只虫子?为什么一个变量起作用而另一个不起作用

从这里开始:看起来我可以将变量传递到函数调用中,但是我必须这样做吗

已尝试上面的链接,但该链接不起作用:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex, Client, ClientDiv) {
            var KNE = Client.KNE[kneIndex];
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);   //Does not work - ClientDiv undefined
没有满意答案的类似问题:

解决方案

$.each(Messages.Additions, function () {
    var $Client = this;
    var $ClientDiv = $("#clientTitle_" + $Client.ClientID);

    if (!$ClientDiv.length) {
        $("#ClientTemplate").tmpl($Client).appendTo("#ClientContainer");
    } else {
        $.each($Client.KNE, function () {
            var $KNE = this;
            var $KNEDiv = $ClientDiv.find("#kneTitle_" + jq($KNE.KNE));    
            // SWITCHED TO $ PREFIX

您可以使用指向循环中当前项的
this
关键字尝试此操作。与其检查
if(ClientDiv==null)
不如检查
if(ClientDiv.length>0)
,因为
jQuery
如果找不到元素就会返回空对象,因此检查将失败

var additions;
jQuery.each(Messages.Additions, function () {
    var $clientDiv = $("#clientTitle_" + this.ClientID);

    if ($clientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function () {
            $clientDiv.find("#kneTitle_" + this.KNE);
        });
    }
});

这不应该是带有小写f的“.find()”吗?很好,我实际上在发布代码后就在这里修复了代码。不幸的是,这不是我问题的原因;-)请阅读“当问JavaScript问题时,您应该”部分,我的意思是“隔离有问题的代码并在在线环境(如JSFIDLE或JS Bin)中复制它”。不,您的代码片段不够清晰,因为它不是孤立的。谢谢您在空检查上的指针。但是,我不知道您的代码如何帮助我避免在子循环中为ClientDiv重新选择。对客户端的引用是有效的部分,失败的是ClientDiv,我可能必须使用Additions/Client reference重新选择,Shankar确实有效。在变量之前添加$做什么?这只是使它成为一个全局变量吗?长度检查是向后看的,不是吗!clientDiv.length?@Jmans,你是说!当长度为0时,clientDiv.length将计算为false?这对我来说是一个新的概念,但如果是这样的话,我喜欢它。@Shankar,我仍然很好奇,前缀$对变量有什么影响?这仅仅是global的简写,还是jquery的神奇之处正在发生?