为什么将命名为值的变量声明为对象会在Firefox中返回函数类型

时间:2018-08-09 08:38:44

标签: javascript firefox

我在JavaScript文件中使用了var values = {};。但是,当我在Firefox typeof(values)上测试我的应用程序时,返回的是函数而不是对象。可以在Firefox控制台窗口中轻松测试。由于此变量已在我的应用程序中多次使用;更改其名称可能不是可行的解决方案。我的问题是:

  1. 有没有办法将此变量名强制为对象?
  2. 为了避免这个问题,我还应该考虑其他哪些变量名?

3 个答案:

答案 0 :(得分:3)

问题是您的分配试图更改只读属性window.values,该属性是一个函数,一个控制台实用程序。

如果在内部范围内进行操作,则不会出现此类问题:

(function(){ var values = {}; console.log(typeof values) })()

Chrome与Firefox之间的区别在于Chrome并未将此属性定义为只读。

答案 1 :(得分:1)

那只是Firefox控制台的产物,它不会影响您的实际代码。如果您在实际的脚本代码中使用typeof values,则会看到它是undefined(如果您按照问题所示创建它,则将看到object)。

Firefox的控制台提供values作为查看对象值的一种方式:

>> values({foo: "bar"})
-> Array [ "bar" ]

Firefox控制台中还有其他可用功能;他们是documented here

Chrome / Chromium也有很多(包括valuesdocumented here)。

  

有没有办法将此变量名强制为对象?

在真实的脚本代码中,而不是控制台中,使用values没问题。但是,我建议避免创建全局变量,因为全局命名空间非常拥挤。

  

为了避免这个问题,我还应该考虑其他哪些变量名?

nametitle是人们常去的地方。这是不使用全局变量的另一个原因。而是将您的代码放在作用域函数中:

(function() {
    // Your code here
})();

答案 2 :(得分:-1)

由于在firefox中这样做,您试图覆盖/重新分配类型为 function

的全局只读窗口对象 values
window.values // its a function

Chrome不会将values视为只读对象

为了使其在Firefox中如您所愿,您需要将其放置在函数中

function test() {
  var values = {};
  console.log(typeof values); // typeof: object
}