为什么定义参数时需要"this"?

Why is "this" necessary when define arguments?

function Person(firstName, lastName, age)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
}

var family = {};
family.mother = new Person("Susan", "Doyle", 32);
…

我们必须在这里使用"this"吗?为什么?

function …
{
     firstName = firstName;
     lastName = lastName;
     age = age;
  }

不知道这个问题是不是太简单了……

这里需要this来引用当前对象的值。

如果您不使用 this 关键字,局部变量会被函数参数隐藏。

在您的 Person() 函数作用域中 - 函数参数的优先级高于局部变量。这意味着在你的 Person() 函数中,默认情况下 firstName 被视为函数参数,即使有一些同名的字段。在这种情况下,使用 this 关键字来引用字段。

在javascript中这个词是对调用对象的引用。

所以如果我们有一个全局函数

function () {console.log(this);} // Window

我们得到全局对象或者window。

如果我们在对象中有更深层次的功能

var obj = {f: function (){console.log(this);}};
obj.f(); // Object {f: function} we get the object that wraps the function.

如果我们使用应用调用模式,这条规则就被打破了

obj.f.apply(window); // window is now bound to this.

在你的例子中,如果你只是调用

Person(); // in global scope

你实际上是在分配

window.firstName = // ...
window.lastName = // ...
window.age = //...

因为从全局范围调用时 this 关键字绑定到 window 对象

您基本上创建了一个应该使用 new 运算符调用的构造函数。 new 运算符用一个创建对象的函数包装您的函数,并使用将对象作为 this 参数的 apply 方法调用您的函数。

var bob = Person("bob"); // bob is undefined but you changed the window object

var sue = new Person("sue"); // sue is an object like you expect.

检查你的代码

var family = {}; // make an object
family.mother = new Person("Susan", "Doyle", 32);

因为您在执行函数之前使用了 new,js 为您创建了一个新对象,并对该对象使用了应用模式。这就是引擎盖下发生的事情

family.mother = {};
Person.apply(family.mother, ["Susan", "Doyle", 32]);

这是定义对象构造函数的正确方法。你可以得到参考 here

  1. this关键字 在 JavaScript 中,名为 this 的东西是 "owns" JavaScript 代码的对象。
  2. 当在函数中使用时,this 的值是 "owns" 函数的对象。
  3. this的值,当用在对象中时,就是对象本身。
  4. 对象构造函数中的 this 关键字没有值。它只是新对象的替代品。
  5. this的值会在构造函数创建对象时成为新对象

注意 this 不是变量。它是一个关键字。您无法更改 this.

的值