2016-08-09 92 views

回答

4

你显然是在全球范围内运行它。用var声明的全局变量成为全局对象的属性。 在浏览器上,该对象是windowwindow已经有一个名为name的属性:它是窗口的名称(如果有的话)。在Firefox上,它只能是一个字符串,因此将对象分配给它将被忽略; IE显然更宽松(可以说,从HTML5规范来看,错误的是name is defined as a DOMstring)。因此,name = new Name1("11")最终成为Firefox上的禁用操作,而name.name(读取字符串的name属性)会生成undefined

如果改变变量的名字,你会得到两种浏览器相同的输出:

function Name1(name){ 
 
    this.name = name; 
 
} 
 
var x = new Name1("11"); 
 
console.log(x.name);

冲突这样是很多很多的理由来避免运行一个代码在全球范围内,如果你能帮助它;换东西在划定范围功能:

(function() { 
 
    function Name1(name){ 
 
     this.name = name; 
 
    } 
 
    var name = new Name1("11"); 
 
    console.log(name.name); 
 
})();


相比之下,let声明的全局变量做成为全球对象,这立即引发问题的性质:Firefox上的let以下脚本的输出是什么?

// REQUIRES ES2015+ SUPPORT 
 
function Name1(name){ 
 
    this.name = name; 
 
} 
 
let name = new Name1("11"); 
 
console.log(name.name + " (" + typeof name + ")");

而答案,令人满意的是,它输出“11(对象)”(也是如此铬,这也正确地输出undefined为原始示例),而上述与varhttps://jsfiddle.net/s1j11023/)输出 “未定义(字符串)”:

// REQUIRES ES2015+ SUPPORT 
 
function Name1(name){ 
 
    this.name = name; 
 
} 
 
var name = new Name1("11"); 
 
console.log(name.name + " (" + typeof name + ")");

+1

将这些作为不在全局空间中运行代码并始终使用'var'(或'let' /'const')的原因加以解决。 –

相关问题