我可能会遇到很多问题,但让我们用更简单的例子来简化它们。
假设有两个变量,a=cat
和b=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';
}
}
}
如果您了解更多描述性替代方案,请修复标签。
答案 0 :(得分:2)
JavaScript中的变量不包含值,它们引用它们。当你做var a = [];
时会发生两件事:
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
答案 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(),如果你不需要,你应该避免使用它,而这个代码是你不需要的。