在某处找到了这段代码:
function Name1(name){
this.name = name;
}
var name = new Name1("11");
document.write(name.name);
Output:
IE11 - "11"
Firefox43 - "undefined"
只是想知道为什么会这样,正确的输出应该是什么?
您显然正在全局范围内运行它。声明为的全局变量var
成为全局对象的属性。1在浏览器中,该对象为window
。window
已经有一个名为的属性name
:这是窗口的名称(如果有的话)。在Firefox上,它只能是一个字符串,因此为它分配一个对象会被忽略;IE显然宽容得多(并且可以说,就HTML5规范而言,这是错误的;name
定义为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);
})();
1与此相反,声明全局变量let
就没有什么是下面的脚本与输出:成为全球对象,这立即引发问题的性质let
在Firefox?
// REQUIRES ES2015+ SUPPORT
function Name1(name){
this.name = name;
}
let name = new Name1("11");
console.log(name.name + " (" + typeof name + ")");
令人满意的答案是,它输出“ 11(对象)”(Chrome也会正确输出,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 + ")");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句