嘿伙计们,我有以下小程序:
function foo() {
this.x = 2;
return this;
}
var y = foo();
var g = foo();
g.x = 3;
console.log("y", y.x); // 3
console.log("g", g.x); // 3
console.log("this", this.x); //3
现在所有3个console.logs打印3,我猜第一个console.log打印3因为yx被gx覆盖但是我不太明白为什么this.x打印3,因为我没有this.x在全球范围内。
我的第一个问题:为什么this.x打印3?
现在,如果我的原始程序员以下列方式纠正(基本上我正在添加新的运算符):
function foo() {
this.x = 2;
return this;
}
var y = new foo();
var g = new foo();
g.x = 3;
console.log("y", y.x); // 2
console.log("g", g.x); // 3
console.log("this", this.x); // undefined
我得到更可预测的结果,或者更期望的结果(检查评论)。
新操作员与我有什么不同,现在我浏览了SO并找到了以下帖子:
我也看到了MDN文档,但我仍感到困惑。
有人可以回答我的第一个问题然后还告诉我最重要,新运营商如何有所作为?在我的例子中,让你的答案简明扼要,告诉我为什么新的操作员给我我想要的结果的确切原因?
谢谢。
亚历山大答案 0 :(得分:3)
要确定函数中this
的值,Javascript会查看您如何调用此函数:
.apply
(或.call
)来调用它,就像在foo.call(someObj)
中一样,this
是第一个参数的值new
,this
是新创建的对象someObj.foo()
中一样,this
就是点前面的点(someObj
这里)this
是全局对象(window
,如果您在浏览器中运行)注意:以上是有意简化的,请参考standard了解全貌(搜索" thisArg")
因此,在您的第一个片段中,您修改了Global对象并将其返回。在第二个代码段中,您修改并返回由new
创建的新对象。
答案 1 :(得分:-1)
我的问题是为什么当我在下面的程序中使用new关键字时,我是否得到了所需的结果,如下所示。
function foo() {
this.x = 2;
return this;
}
var y = new foo();
var g = new foo();
g.x = 3;
console.log("y", y.x); // 2
console.log("g", g.x); // 3
console.log("this", this.x); // undefined
现在没有新的结果是
console
3
3
undefined
现在我确实阅读了Mozilla,但它对理解new关键字没有帮助。
我的常识告诉我的是,当我说出以下内容时:
p = foo();
我仍然指的是foo()的原始副本,因此对其进行了任何修改 p会影响foo()。
但是当我说:
p = new foo();
我实际上正在创建一个与
有时常识比文档更好(我仍然建议通过LOL阅读文档。)
new正在做它想做的事情,创建一个新的函数独立实例。