javascript - JavaScript 中的引用问题?

标签 javascript variables reference evaluation

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

假设有两个变量,a=catb=a,并且您想通过 b 的值 a 进行引用 到那个 var 即 a。那么我可以通过哪个命令来做到这一点?变量 SomeCommand(b) 和变量 a 应该指向相同的内存空间,因为 b 被评估为 a。同样的问题出现在下面的代码中,我们有部分 document.getElementById(vals[0].split('|')[0]).style.display= 'block'; 应该被评估为 document.getElementById(picture).style.display= 'block'; 即显示图片,但上面的例子解释起来更清晰,所以请引用它。如何做引用?以上两种方式是否等价?我在这里很注意,因为在其他语言中遇到过类似的问题,但它们是关于 inode、符号/硬链接(hard link)和诸如此类的东西,但不知道这在 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 中的变量不包含值,它们引用值。当您执行 var a = []; 时,会发生两件事:

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

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

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

总结:

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

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

每个“全局变量”实际上都是全局对象的命名属性。在网络浏览器中,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

关于javascript - JavaScript 中的引用问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486830/

相关文章:

javascript - 无法对动态加载的元素应用 jquery 函数

javascript - 如何用javascript初始化php变量?

angular - 组件声明、模板变量声明和元素引用不包含此类成员

jquery - 从 jQuery 原型(prototype)函数 ($.fn) 获取实例/引用

Javascript - 在上下文/范围中进行评估,无需使用此关键字而不使用 with 语句

javascript - Highcharts Add Annotation 不是动态添加的函数

javascript - 如何用 Marionette 将两个 ItemView 包装到同一个 div 中?

bash cat 删除字符

c++ - 将 vector 引用复制到另一个

c++ - 在 C++ 成员函数中引用指针