为什么定义参数时需要"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
- this关键字
在 JavaScript 中,名为 this 的东西是 "owns" JavaScript 代码的对象。
- 当在函数中使用时,this 的值是 "owns" 函数的对象。
- this的值,当用在对象中时,就是对象本身。
- 对象构造函数中的 this 关键字没有值。它只是新对象的替代品。
- this的值会在构造函数创建对象时成为新对象
注意 this 不是变量。它是一个关键字。您无法更改 this.
的值
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
- this关键字 在 JavaScript 中,名为 this 的东西是 "owns" JavaScript 代码的对象。
- 当在函数中使用时,this 的值是 "owns" 函数的对象。
- this的值,当用在对象中时,就是对象本身。
- 对象构造函数中的 this 关键字没有值。它只是新对象的替代品。
- this的值会在构造函数创建对象时成为新对象
注意 this 不是变量。它是一个关键字。您无法更改 this.
的值