1

在这个W3Schools 示例中,我没有了解如何changeName工作:

function person(firstname, lastname, age, eyecolor) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;

    this.changeName = changeName;

    function changeName(name) {
        this.lastname = name;
    }
}
myMother = new person("Sally", "Rally", 48, "green");
myMother.changeName("Doe");
document.write(myMother.lastname);

http://jsfiddle.net/MrGe4/

为什么我们有this.changeName=changeName,然后是函数定义changeName呢?

4

5 回答 5

4

它正在changeNameperson对象定义一种方法 - 但以一种迂回的方式,等效(和更好)的方法是:

this.changeName = function(name) {
  this.lastname = name;
}

(因此“请不要使用 w3school”)

于 2013-08-28T13:52:26.607 回答
1

在 JavaScript 中,这段代码:

function foo() {
    function changeName() {

    }
    this.changeName = changeName;
}

是相同的

function foo() {
    this.changeName = changeName;
    function changeName() {

    }
}

这是因为在 javascript 中提升所有声明都由解释器放在开头。

于 2013-08-28T13:54:33.383 回答
1

以下是一些可能的问题的附加答案:

JavaScript 只有两个作用域:

  1. 全球范围

  2. 功能范围

JavaScript中没有块作用域!

由于变量提升,在范围内声明的所有变量都可用,就好像它们都是在该范围的开头声明的一样。

这就是为什么建议在其作用域的开头声明所有变量,以更好地反映现实,可能在单个 var 声明中。

例如

function person(firstname, lastname, age, eyecolor) {
    var changeName = function (name) {
        this.lastname = name;
    }
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;

    this.changeName = changeName;

}

实际上,在这种情况下,根本不需要变量或命名函数。

只需直接为对象属性分配一个匿名函数:

function person(firstname, lastname, age, eyecolor) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;
    this.changeName = function (name) {
        this.lastname = name;
    }
}

JSLint 或 JSHint 等工具将帮助您改进 JavaScript 代码。

请参阅此示例 @ codepen.io(在 JS 编辑器中按 CTRL+SHIFT+7)和在 codepen.io 使用 JSHint

最后,Mozilla 开发者网络是比 W3Schools 更好的资源。

它甚至会教你在document.write 中做笔记这不是很好的做法。

于 2013-08-28T14:57:36.700 回答
1

This.changeName 是一个属性。

this.changeName=changeName 只是函数的声明。

//Here you create your Person Object
myMother=new person("Sally","Rally",48,"green");

//Here you affect the LastName "Doe" By calling the ChangeName function of the object Person
myMother.changeName("Doe");
于 2013-08-28T13:51:43.560 回答
1

这是您的代码(来自您所做的参考):

<!DOCTYPE html>
<html>
<body>
<script>
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;

this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}
myMother=new person("Sally","Rally",48,"green");
myMother.changeName("Doe");
document.write(myMother.lastname);
</script>

</body>
</html>

当您键入此代码时:

function changeName(name)
{
this.lastname=name;
}

你基本上是在做一个功能。

当你这样做时:

this.changeName=changeName;

您基本上是在说“函数changeName(在RHS上)属于这个函数,即人。(但是,人被用作对象)”

因此,当您看到链接给出的代码时,全局代码定义了一个对象myMotherchangeName并通过它访问myMother.changeName()只是因为您说,this.changeName = changeName

于 2013-08-28T13:49:41.910 回答