为什么我不能定义一个名为“状态”的数组?

时间:2018-07-29 03:55:16

标签: javascript

作为标题。 有人可以告诉我为什么吗? 非常感谢你!

<script type="text/javascript">
        var status=[1,2,3];
        console.log(typeof(status));
        console.log(status);        // the result is "1,2,3"

        var normal_array=[1,2,3]; 
        console.log(typeof(normal_array));
        console.log(normal_array);  // the result is "(3) [1,2,3]"
</script>

3 个答案:

答案 0 :(得分:2)

请参见window.status

  

在浏览器底部的状态栏中设置文本,或返回先前设置的文本。

     

此属性在Firefox和某些其他浏览器的默认配置中不起作用:设置window.status对状态栏中显示的文本无效。要允许脚本更改状态栏文本,用户必须在about:config屏幕中将dom.disable_window_status_change首选项设置为false。

它不能是字符串以外的任何东西,因此在使用时

const

它立即转换为字符串。

请注意,顶层的letconst status = [1,2,3]; console.log(typeof status);不会分配给全局对象:

status

另一种选择是将您的(() => { var status = [1,2,3]; console.log(typeof status); })();放入IIFE:

{{1}}

答案 1 :(得分:1)

这是因为全局变量status在阴影Window.status中。无论何时设置,它的值都将由HTML5 specification转换为字符串(因此会看到'1,2,3'因为调用了Array#toString):

  

出于历史原因,status对象上的Window属性必须在获取时返回设置为它的最后一个字符串,并且在设置时必须自行设置达到新的价值。创建Window对象时,必须将属性设置为空字符串。它什么也没做。

要使用var消除全局阴影,请使用ES2015中引入的块范围变体:

const status = [1, 2, 3]; //or
let status = [1, 2, 3];

答案 2 :(得分:0)

全局作用域包含许多变量,例如status,它们可能会引起类似的麻烦,因为其中一些被锁定为某种类型,而另一些则无法更改。为避免此问题,您可以在函数内部编写代码以获得干净的作用域。用var关键字声明的变量是函数范围的,因此函数可以完成工作。

当变量的作用域是函数而不是全局名称空间时,它将不会覆盖具有相同名称的全局变量。这意味着您仍然可以根据需要通过window.status访问全局域。

示例(在本示例后继续阅读以寻求更好的方式)

//define your function with your code inside
function myCode(){
    var status=[1,2,3];
    console.log(status);
}
myCode(); //call your function

您可以使用IIFE(立即调用函数表达式)来声明函数,然后立即运行它而不必将其绑定到全局名称,这在这种情况下非常有用。

(function(){
    var status=[1,2,3];
    console.log(status);
})();

相同,只是立即调用该函数。这是可取的,因为这里的目的是避免全局名称冲突。