JavaScript中的参考问题?

时间:2010-12-20 04:13:51

标签: javascript variables reference evaluation

我可能会遇到很多问题,但让我们用更简单的例子来简化它们。

假设有两个变量,a=catb=a,并且您希望b的值a引用该变量a。那么我可以通过哪个命令来做呢?变量SomeCommand(b)和变量a应该指向相同的内存空间,因为b被评估为a。同样的问题来自下面的代码,其中我们有部分document.getElementById(vals[0].split('|')[0]).style.display= 'block';应该被评估为document.getElementById(picture).style.display= 'block';,即显示图片,但上面的例子更清楚,所以请参考它。怎么做参考?以上两种方式是否相同?我在这里注意是因为遇到了其他语言中的类似问题,但后来它们是关于inode,符号/硬链接等等,但不知道它在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';
                }
        }

}

如果您了解更多描述性替代方案,请修复标签。

2 个答案:

答案 0 :(得分:2)

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

  1. 在内存中分配一个空数组对象,
  2. 对该数组对象的引用放在变量a
  3. (这并没有真正解决分析时间与评估分配的关系,但考虑到这一点很简单。)

    如果您执行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
    

答案 1 :(得分:0)

您可能想要修改您的问题。我不完全确定你在问什么。您无法弄清楚这段代码是否有问题?这是什么意思?对话的整个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',则会显示'picture',其余部分将被隐藏。也许这就是你所追求的。这个解决方案更好,因为你没有使用eval(),如果你不需要,你应该避免使用它,而这个代码是你不需要的。