1

ECMAScript言語仕様の関数呼び出しセクションを読んでいます

誰かが私のために次の感覚を言い換えたり詳細に説明したりできますか?

本番のCallExpression:MemberExpression引数は、次のように評価されます。

  1. MemberExpressionを評価します。

このコードを例として取り上げましょう。

var john = { 
  name: 'John', 
  greet: function(person) { 
    alert("Hi " + person + ", my name is " + this.name); 
  } 
}; 

john.greet("Mark");

上記のコードを例にとると、本番CallExpressionはどういう意味ですか?この場合のMemberExpression、john.greetとは何ですか?

ありがとう!

4

1 に答える 1

2

MemberExpressionはjohn.greetです。基本的にそれが言っていることは次のとおりです:ステップ1:どの関数を呼び出すかを理解します。:-)john後で登場するので、この部分は重要です。

これが最新の仕様からの完全な引用です(あなたのリンクは第5版に取って代わられた第3版へのリンクです;これはあまり変わっていません):

  1. MemberExpressionを評価した結果をrefとします。
  2. funcをGetValue(ref)とします。
  3. argListを引数の評価の結果とし、引数値の内部リストを作成します(11.2.4を参照)。
  4. Type(func)がObjectでない場合は、TypeError例外をスローします。
  5. IsCallable(func)がfalseの場合、TypeError例外をスローします。
  6. Type(ref)がReferenceの場合、
      a。IsPropertyReference(ref)がtrueの場合、
        i。thisValueをGetBase(ref)とします。
      b。それ以外の場合、refのベースはEnvironmentRecordi
        です。thisValueを、GetBase(ref)のImplicitThisValue具象メソッドを呼び出した結果とします。
  7. それ以外の場合、Type(ref)は参照ではありません。
      a。thisValueを未定義にします。
  8. funcで[[Call]]内部メソッドを呼び出した結果を返し、thisValueをthis値として提供し、リストargListを引数値として提供します。

ご覧のとおりjohn、式はプロパティ参照であるため、6(a)で再び入力されます。したがって、this値は(プロパティ参照を介さjohnにこれを呼び出した場合のように、グローバルオブジェクトではなく)です。

仕様を読んでいる場合は、古いものではなく最新のものを読むことをお勧めします(HTMLバージョンはまだありません)。とはいえ、散文はそれほど騒々しいものではないのではないかと思います。:-)

于 2010-04-29T15:54:54.707 に答える