我的小程序中的新操作符

时间:2015-02-16 11:26:00

标签: javascript

嘿伙计们,我有以下小程序:

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并找到了以下帖子:

New operator

我也看到了MDN文档,但我仍感到困惑。

有人可以回答我的第一个问题然后还告诉我最重要,新运营商如何有所作为?在我的例子中,让你的答案简明扼要,告诉我为什么新的操作员给我我想要的结果的确切原因?

谢谢。

亚历山大

2 个答案:

答案 0 :(得分:3)

要确定函数中this的值,Javascript会查看您如何调用此函数:

  • 如果您使用.apply(或.call)来调用它,就像在foo.call(someObj)中一样,this是第一个参数的值
  • 如果在函数调用之前有newthis是新创建的对象
  • 如果在功能之前有一个点(或括号),就像在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(); 

我实际上正在创建一个与新的独立副本,但不绑定它。现在可以使用和修改p而不影响原始的foo()。

有时常识比文档更好(我仍然建议通过LOL阅读文档。)

new正在做它想做的事情,创建一个新的函数独立实例。