JavaScript:在函数内定义函数

时间:2013-08-28 13:44:51

标签: javascript

在这个W3Schools example中,我没有了解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的函数定义?

5 个答案:

答案 0 :(得分:4)

它正在为changeName对象定义一个方法person - 但是以某种方式,相同(更好)的方法是:

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

(因此'请不要使用w3school')

答案 1 :(得分: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上)属于这个函数,即person。(但是,人被用作对象)”

因此,当您看到链接提供的代码时,全局代码会定义一个对象 myMother ,并且只是因为您说changeName而访问myMother.changeName() this.changeName = changeName 1}}

答案 2 :(得分: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");

答案 3 :(得分:1)

在JavaScript中使用此代码:

function foo() {
    function changeName() {

    }
    this.changeName = changeName;
}

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

    }
}

这是因为在javascript中提升所有声明都是由翻译开始的。

答案 4 :(得分:1)

以下是一些可能问题的其他答案:

JavaScript只有两个范围:

  1. 全球范围

  2. 功能范围

  3. JavaScript中有无阻止范围

    由于变量提升,所有在范围内声明的变量都可用,因为它们都是在该范围的开头声明的。

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

    e.g。

    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代码。

    请参阅this sample @ codepen.io(在JS编辑器中按CTRL + SHIFT + 7)和JSHint use at codepen.io

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

    它甚至会教你document.write Notes这不是一个好习惯。