可以在同一个函数中将JavaScript变量的值更改两次吗?

时间:2011-11-24 16:38:36

标签: javascript variables

不确定这是否被认为是最佳做法,或者你是否应该这样做但我有一小块Javascript我想知道你是否可以声明一个变量,显示该变量然后重新分配它并再次显示它?从语法上看,这似乎是正确的,但我认为这不是最佳做法,应该避免吗?

注意:我没有写这个块我只是想知道它是否正常,或者我是否应该更改它并使用下面的2个变量代码:

var u1 = 'something';

if (u1.indexOf('Accept') > 0)
{       
var URL = 'some URL';
document.writeln(URL);
URL = 'another URL';
document.writeln(URL);
}

提前致谢。

编辑:谢谢你的回答,认为这有点愚蠢。 :/

6 个答案:

答案 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)

我通常喜欢重复使用变量而不是创建新变量