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

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 には 2 つのスコープしかありません。

  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 Developer Network は W3Schools よりも優れたリソースです。

良い習慣ではないdocument.write Notesでも​​教えてくれます。

于 2013-08-28T14:57:36.700 に答える
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;

あなたは基本的に、「(RHS の) 関数 changeName は、この関数、つまり person に属しています。(ただし、 person はオブジェクトとして使用されています)」と言っています。

したがって、リンクで指定されたコードを見ると、グローバルコードはオブジェクトmyMotherを定義し、あなたが言ったという理由だけでchangeName経由してアクセスします。myMother.changeName()this.changeName = changeName

于 2013-08-28T13:49:41.910 に答える