2

誰かがこのコードを説明できますか?この例は、javascript.infoから抜粋したものです。

f.toString = function(){ return sum}特にその部分はわかりません。

function sum(a) {

   var sum = a 

   function f(b) {
       sum += b
       return f
   }

   f.toString = function() { return sum }

   return f
}

alert( sum(1)(2) )  // 3

alert( sum(5)(-1)(2) )  // 6

alert( sum(6)(-1)(-2)(-3) )  // 0

alert( sum(0)(1)(2)(3)(4)(5) )  // 15
4

4 に答える 4

0

javascriptのすべてのオブジェクトはtoString、bojectのプロトタイプに存在するというフィールドを継承します。割り当て後toStringは、fの他のフィールドと同じように存在します。関数として割り当てられ、次のように呼び出すことができます。

于 2012-10-27T23:01:47.800 に答える
0

基本的にsumは、複数の呼び出しにチェーンできる関数です。toString文字列を期待するコンテキストでオブジェクトが使用された場合に表示される内容を返すオブジェクトのメソッドです。

個人的には、次のように簡単だと思います。

function sum() {
    var l = arguments.length, i, a = 0;
    for( i=0; i<l; i++) a += arguments[i];
    return a;
}
alert(sum(1,2));
alert(sum(5,-1,2));
alert(sum(6,-1,-2,-3));
alert(sum(0,1,2,3,4,5));
于 2012-10-27T23:03:27.103 に答える
0

そのスニペットの作成者は、1つの目標、つまり、他の言語で可能な「偽の」演算子のオーバーロードのようなものを達成したいと思っていたと思います。

関数参照sumを返すので、私たちは次のように行くことができませんでした

sum(5) + 5;

その結果、のような奇妙な結果になり"function sum() { ... }5"ます。これは、ECMAscriptがMath操作.toString()で呼び出されたときにオブジェクトのメソッドを呼び出すためです。しかし、彼は返すメソッド(数値)を上書きするため、再び機能します。.toString()sum

于 2012-10-27T23:14:29.530 に答える
0

これは、Function.toStringに関するMDN記事の抜粋です。

Functionオブジェクトは、Objectから継承されたtoStringメソッドをオーバーライドします。Object.prototype.toStringを継承しません。Functionオブジェクトの場合、toStringメソッドは、関数宣言の形式でオブジェクトの文字列表現を返します。つまり、toStringは関数を逆コンパイルし、返される文字列には、関数キーワード、引数リスト、中括弧、および関数本体のソースが含まれます。

関数がテキスト値として表される場合、たとえば関数が文字列と連結されている場合、JavaScriptはtoStringメソッドを自動的に呼び出します。

したがって、基本的に、この「厄介な」コードが実行しているのは、文字列表現が必要な場合、つまりアラートが呼び出された場合(アラートは引数として文字列を受け取る)に使用されるFunction.toStringの実装を提供することです。

コードの残りの部分では、引数の合計を計算するためにそれ自体を再帰的に呼び出すだけです。

于 2012-10-27T23:54:13.473 に答える