2

私はjavascriptを読んでいます:Douglas Crockfordによる良い部分。特定の例と著者が提供する説明を理解するのに苦労しています。

例 1: (38 ページ)

var quo=function (status) {
    return {
        get_status:function() {
           return status;
       }
    };
};

var myQuo=quo("amazed");
document.writeln(myQuo.get_status());

本からの説明(私はこれを理解していません。この部分を説明してください):

この quo 関数はnewプレフィックスなしで使用するように設計されているため、名前は大文字ではありません。quo を呼び出すと、get_status メソッドを含む新しいオブジェクトが返されます。そのオブジェクトへの参照は myQuo に保存されます。get_status メソッドは、quo が既に返されていても、quo の status プロパティへの特権アクセスを引き続き持っています。get_status は、パラメーターのコピーにアクセスできません。パラメータ自体にアクセスできます。これが可能なのは、関数が作成されたコンテキストにアクセスできるためです。これを閉鎖と呼びます。

例 2 (39 ページ):

//make a function that assigns event handler function to array of nodes
//when you click on a node, an alert box will display the ordinal of the node

var add_the_handlers=function (nodes) {
    var helper=function(i) {
        return function(e) {
            alert(i);
        }
    };
    var i;
    for (i=0;i<nodes.length;i++) {
        nodes[i].onclick=helper(i);
    }
};

このコードがどのように機能するか、さらにはどのような機能(e)が機能するかを理解するのが困難です? ヘルパー関数が関数を返し、その関数が何も返さない理由。それは私にとって非常に紛らわしいです。誰かが簡単な言葉で説明できるなら、それは非常に役に立ちます。どうもありがとう

EDIT:
According to the book is the bad example for the above(example 2):
  var add_the_handlers=function(nodes) {
    var i;
    for (i=0;i<nodes.length;i++) {
     nodes[i].onclick=function(e) {
     alert(i);
     };
   }
};

これは常にノード数を表示するため、著者はこれを悪い例として挙げています。

4

2 に答える 2

5

彼が例で暗示していたのは、パラメーターのコピーを作成して関数statusに渡す必要がないという事実だったと思います。これは、パラメーターが定義されたコンテキスト内に含まれるすべてのものに暗黙的にアクセスできるためです (この場合、)get_statusget_statusquo

同様に、例 2 では

ここに画像の説明を入力

于 2013-06-18T02:15:22.120 に答える
4

ヘルパー関数が関数を返し、その関数が何も返さない理由。

JavaScript では、関数は明示的に値を返す必要はありません。戻り値が省略された場合、暗黙のreturn undefined;is になります。

さらに、関数はオブジェクトです。したがって、helper()関数を返す JavaScript 関数です。

function(e) {
   alert(i);
}

for ループの後半で、nodes[i].onclick=helper(i);この行は関数を実行しhelper()、関数オブジェクトを返します。これはonclickノードのハンドラに割り当てられます。

悪い例では、著者は初心者の JavaScript 開発者をつまずかせる一般的な問題を示しています。

//According to the book is the bad example for the above(example 2):
 var add_the_handlers=function(nodes) {
  var i;
  for (i=0;i<nodes.length;i++) {
   nodes[i].onclick=function(e) {
   alert(i);
   };
 }

この場合、初心者のプログラマーは、各ノードがそのインデックスを表示することを期待しています。ただし、onclick ハンドラーが の周りにクロージャーを作成したため、ii値は外側のスコープの値に設定されます。これは、初心者プログラマーが期待するように関数が割り当てられiたときではなく、関数が実行されたときの の値になります。したがって、クリックされたノードごとに、配列内のノードの数と同じ数が出力されます。nodes.length

コメントごと:

さらに、 funciton(e) の e が何をするのか説明できますか?

DOM API では、イベント ハンドラーはすべて、イベントに関する情報を含むイベント オブジェクトを渡します。この場合、eはクリック イベント オブジェクトです。Andeはこの関数では使用されないため、省略された可能性があります。

于 2013-06-18T01:25:51.477 に答える