我下面可能有很多问题,但让我们用更简单的例子来简化它们。
假设有两个变量,a=cat
和 b=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 = [];
时,会发生两件事:
- 在内存中分配一个空数组对象,并且
- 对该数组对象的引用放在变量
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/