不确定这是否被认为是最佳做法,或者你是否应该这样做但我有一小块Javascript我想知道你是否可以声明一个变量,显示该变量然后重新分配它并再次显示它?从语法上看,这似乎是正确的,但我认为这不是最佳做法,应该避免吗?
注意:我没有写这个块我只是想知道它是否正常,或者我是否应该更改它并使用下面的2个变量代码:
var u1 = 'something';
if (u1.indexOf('Accept') > 0)
{
var URL = 'some URL';
document.writeln(URL);
URL = 'another URL';
document.writeln(URL);
}
提前致谢。
编辑:谢谢你的回答,认为这有点愚蠢。 :/答案 0 :(得分:5)
您可以根据需要多次更改变量的值。变量经常被重用,因此我们节省了内存资源。不是你使用它们的方式(因为这是一个最好在调用函数时直接提供常量字符串的例子),但想想一个我们甚至没有想到多个变量值赋值的日常例子。一个for
循环:
for (var i = 0; i < 100; i++)
{
...
}
在此循环中,变量i
被赋予101次新值。这是一个相当明显的例子,我们根本没有想到这一点,但除此之外,我们可以有一组循环并更明确地重用相同的变量,并为它赋值很多次,如:
var counter = 0;
for(var item = GetLinkedListFirstItem(); item != null; item = item.Next)
{
counter++;
}
// other code...
counter = 0;
while (counter < 10 || someOtherCondition)
{
// do something else
}
这可能是显式变量可重用性的一个更好的例子,其值的变化很多次并且用于不同的目的。
变量重用有时是不受欢迎的/不受欢迎的。那就是我们有一个有意义的变量名称,如isUserLoggedIn
。很难将这些变量重用于其他目的,因为它会使代码无法维护。
通常重用的变量因此可能是迭代器(即。i
)或通常命名的变量而没有太多意义。或者具有更多通用名称的变量(即。finished
),可以在可以与此类变量名称关联的不同上下文中重复使用。
在某些情况下,您可能会遇到问题,即使查看代码看起来也很完美。当你使用异步函数时就是这种情况,这在使用Ajax调用或时间延迟调用(即setTimeout
)时经常出现。请考虑以下代码:
var loaded = false;
$.ajax({
url: "...",
type: "POST",
success: function(){
loaded = true;
}
});
if (loaded === true)
{
// do something important
}
// ok loaded not used any more, so we can reuse it
// we can easily change its type from number to string or anything else
loaded = "Peter loaded his gun";
此代码有错误,因为重要代码将不会被执行。永远!对于不理解异步性的不理智的开发人员来说,这是一种常见的误解。
提示:当代码发出Ajax调用时,它不会等待响应,而是继续执行并执行
if
语句。即使Ajax调用在0时间内响应,成功函数也不会执行,直到当前正在运行的代码无法完成执行。这就是Javascript的工作原理。排队代码执行。最后,当Ajax异步代码执行时,它最终将覆盖存储在变量中的字符串。
答案 1 :(得分:3)
为什么不呢?当然,根据需要更改变量值是正常的。这实际上是为什么它被称为“变量”,而不是“常数”:)
答案 2 :(得分:2)
我说这样做完全没问题。
但是,请记住,它可能会导致异步代码出现问题。举例来说,例如async
接受一段时间后运行的回调:
var a = 123;
async(function() {
alert(a); // alerts 456, because `a` was set to 456
// *before* this callback was run.
// Because there is only one `a`, that variable
// has been overridden
});
a = 456;
async(function() {
alert(a); // alerts 456
});
答案 3 :(得分:1)
可以在JavaScript中重新分配变量。他们是否应该是一个风格和背景的问题。
答案 4 :(得分:1)
是的,这是可能的,在这种情况下,创建新变量没有意义。但是,如果你有很多代码,稍后重新分配一个变量肯定会让人感到困惑,特别是如果它首先是一个对象,那么它后来就是一个字符串。
答案 5 :(得分:0)
我通常喜欢重复使用变量而不是创建新变量