发现这段代码的地方:相同的脚本,IE与Firefox的不同输出,为什么?
function Name1(name){
this.name = name;
}
var name = new Name1("11");
document.write(name.name);
Output:
IE11 - "11"
Firefox43 - "undefined"
只是想知道为什么它,应该是什么正确的输出?
发现这段代码的地方:相同的脚本,IE与Firefox的不同输出,为什么?
function Name1(name){
this.name = name;
}
var name = new Name1("11");
document.write(name.name);
Output:
IE11 - "11"
Firefox43 - "undefined"
只是想知道为什么它,应该是什么正确的输出?
你显然是在全球范围内运行它。用var
声明的全局变量成为全局对象的属性。 在浏览器上,该对象是window
。 window
已经有一个名为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
为原始示例),而上述与var
(https://jsfiddle.net/s1j11023/)输出 “未定义(字符串)”:
// REQUIRES ES2015+ SUPPORT
function Name1(name){
this.name = name;
}
var name = new Name1("11");
console.log(name.name + " (" + typeof name + ")");
将这些作为不在全局空间中运行代码并始终使用'var'(或'let' /'const')的原因加以解决。 –