【问题标题】:reference problem in JavaScript?JavaScript 中的引用问题?
【发布时间】:2010-12-20 04:13:51
【问题描述】:

下面可能有很多问题,但让我们用更简单的例子来简化它们。

假设有两个变量a=catb=a,并且您希望通过bs 值a 引用该变量,即a。那么我可以通过哪个命令来做到这一点?变量SomeCommand(b) 和变量a 应该指向相同的内存空间,因为b 被评估为a。同样的问题出现在下面的代码中,我们有部分document.getElementById(vals[0].split('|')[0]).style.display= 'block'; 应该被评估为document.getElementById(picture).style.display= 'block'; 即显示图片,但上面的例子解释得更清楚,所以请参考它。怎么做参考?以上两种方式是否等价?我在这里保持警惕,因为在其他语言中遇到过类似的问题,但后来它们是关于索引节点、符号/硬链接等的,但不知道这在 JS 中是如何工作的。很快,他们如何得到评估?


function change_visibility(binX)

{
     // binX is a thing that matches `/^[10Xx]+$/`
     // 1 = show the thing
     // 0 = do not show the thing
     // x/X = do not do anything
     //
     // for example, 00011x would turn OFF picture-quote-question_mark 
     // while turning ON search and help but not doing anything to 
     // typing pad's current state


        var vals = ['picture|binX.charAt(0)',
                        'quote|binX.charAt(1)',
                        'question_mark|binX.charAt(2)',
                        'search|binX.charAt(3)',
                        'help|binX.charAt(4)',
                        'typingPad|binX.charAt(5)'
                        ];

        for (var i=0; i<vals.length; i++)
        {
                if(vals[i].split('|')[1]==1)
                {
                        //TODO: check whether you can do it like this, 
                        // assumed for example that vals[0].split('|')[0] =picture
                        // but it is not, the "inode" or let call it arrow is diffent!
                        // ERROR HERE ?!?
                        document.getElementById(vals[i].split('|')[0]).style.display= 'block';
                }
                else if(vals[i].split('|')[1]==0)
                {
                        document.getElementById(vals[i].split('|')[0]).style.display= 'none';
                }
        }

}

如果您知道更多描述性替代方案,请修正标签。

【问题讨论】:

    标签: javascript variables reference evaluation


    【解决方案1】:

    JavaScript 中的变量不包含值,它们引用它们。当您执行var a = []; 时,会发生两件事:

    1. 在内存中分配了一个空数组对象,并且
    2. 对该数组对象的引用放在变量a中。

    (这并没有真正解决解析时间与评估分配的问题,但考虑到这一点很简单。)

    如果您随后执行var b = a;,则不会复制数组;对同一数组的另一个引用被放入变量b

    总结一下:

    var a = [];
    var b = a;
    b.push(42);
    console.log(a);
    //-> [42]
    

    它们是一样的。您不能导致修改“b”会导致“a”引用不同对象的情况。

    每个“全局变量”实际上都是全局对象的命名属性。在 Web 浏览器中,window 对象是全局对象。再加上属性访问总是可以通过点表示法(例如foo.bar)或方括号表示法(例如foo["bar"])实现的事实,您可以按名称查找任何全局变量。例如:

    a1 = 42;
    a2 = 17;
    var b = "a1";
    console.log( window[b] ); //42
    b = "a2";
    window[b] = 999;
    console.log( a2 ); // 999
    

    对于局部变量,情况并非如此。与某些语言不同(例如Io,您无法访问存储并允许枚举或间接访问所有局部变量的对象。对于这种情况,您需要自己的对象:

    var variables = {
      a1 : 42,
      a2 : 17
    };
    
    var b = "a1";
    console.log( variables[b] );
    // -> 42
    

    【讨论】:

      【解决方案2】:

      您可能想修改您的问题。我不完全确定你在问什么。这段代码有没有你想不通的问题?它应该做什么?对话的整个 a、b 参考部分与您提交的代码无关。您传递的变量未在您的代码中使用。此外,您的 if 语句将拆分与 == 1 进行比较。但是,它永远不会等于 1 或 0。它只会是“|”右侧的那些短语之一。无论如何,也许你可以修改你的问题,它会更有意义。

      让我稍微重写一下你的代码,这样你就不会在数组中出现 binX 垃圾了。

      function change_visibility(binX) {
      
      var vals = ['picture',
                      'quote',
                      'question_mark',
                      'search',
                      'help',
                      'typingPad'
                      ];
      
      for (var i=0; i<vals.length; i++) {
              var val = binX.charAt(i);
      
              if(val=='1') {
                 document.getElementById(vals[i]).style.display= 'block';
              } else if(val=='0') {
                 document.getElementById(vals[i]).style.display= 'none';
              }
      }
      }
      

      这可能就是你所追求的。因此,如果 binX 为“10000”,则“图片”将显示,其余部分将被隐藏。也许这就是你所追求的。这个解决方案更好,因为你没有使用 eval() ,如果你不需要,你应该避免,而这段代码你也不需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        相关资源
        最近更新 更多