javascript 意味 「適用」または「呼び出し」になぜ「null」を渡すのでしょうか。



js page title (4)

最初の引数としてnullを指定してapplyを呼び出すapplyは、 thisオブジェクトを指定せずに関数を呼び出すのと同じです。

applyメソッドは何をするのですか?

apply()メソッドは、 argumentsされたthis値と、配列(または配列に似たオブジェクト)として渡されたargumentsして関数を呼び出します。

fun.apply(thisArg, [argsArray])

thisArg

これの価値はfunへの呼び出しに提供されました。 これがメソッドから見た実際の値ではないかもしれないことに注意してください。もしメソッドが非厳密モードコードの関数であれば、nullとundefinedはグローバルオブジェクトに置き換えられ、プリミティブな値はボックス化されます。

さらなる文書はhere

このJavaScriptのリファレンスによると:

null値は、nullまたは "空の"値を表すJavaScriptリテラルです。つまり、オブジェクト値は存在しません。 それはJavaScriptの原始的な価値観の一つです。

function getMax(arr){
  return Math.max.apply(null, arr);  
}

キーワードを明示的に渡した方が明確ではないでしょうか、それとも少なくとも読みやすくなりませんか。 また、この時点で私はなぜあなたがnullを使うのか理解できないかもしれません。


実行時に決定される関数に何かをする責任を渡し、その関数に可変数の引数を渡す場合は、Applyが便利です。 あなたがそうしているとき、あなたは適切な "this"コンテキストを持っていてもいなくてもよいです。

たとえば、私は自分が書いたライブラリを使って、applyを使うアプリケーションイベントを聞いたり上げたりしやすくしています。

私はこのようなイベントを起こすことができるようになりたかったです:

EventManager.raise('some:event-name', arg1, arg2, arg3, ..);

..そしてそのイベントのために登録されたすべてのハンドラがその引数のリスト(arg1、arg2など)で呼ばれるようにします。 そのため、raise関数では、そのイベント名に登録されているハンドラを調べてそれらを呼び出し、イベント名を除いて渡された引数をすべて次のように渡します。

var args = [];
Array.prototype.push.apply(args, arguments);
args.shift();
for (var l in listeners) {
    var listener = listeners[l];
    listener.callback.apply(listener.context, args);
}

登録済みハンドラ(listener.callback)が呼び出されると、applyは可変数の引数を渡すために使用されます。 ここでは、リスナが定義されたときにリスナがイベントハンドラにthisコンテキストを提供することを許可しましたが、そのコンテキストが定義されていないか、nullである可能性があります。

長い間、raise関数はどんなコールバックコンテキストも使いやすくしませんでした。 私はやがてそれを必要とすることに遭遇したので、私はそれを支持しました、しかし、ほとんどの場合、私は本当にそれを必要としないか使用しません。


私はこれに答えるために少し遅れています。 私はここで長い説明的な説明をするようにします。

JavaScriptのnullは何ですか?

値nullはリテラルです(undefinedのようにグローバルオブジェクトのプロパティではありません)。 それはJavaScriptの原始的な価値観の一つです。

APIでは、オブジェクトが期待できる場所にnullが取り出されることがよくありますが、オブジェクトは関係ありません。

fun.apply(thisArg、[argsArray])

thisArg :funの呼び出しに対して提供されたthisの値。 これがメソッドから見た実際の値ではないかもしれないことに注意してください。もしメソッドが非厳密モードコードの関数であれば、nullとundefinedはグローバルオブジェクトに置き換えられ、プリミティブな値はボックス化されます。

argsArrayfunを呼び出すときに使用する引数、または関数に引数を指定しない場合はnullまたは未定義値を指定する配列のようなオブジェクトです。 ECMAScript 5以降では、これらの引数は配列ではなく一般的な配列のようなオブジェクトになることができます。 ブラウザの互換性情報については、以下を参照してください。

厳密モードを使用している場合は、thisまたはMathをパラメータとして渡すことをお勧めします。


「適用」または「呼び出し」になぜ「null」を渡すのでしょうか。

関数内のthisポインタに指定したい値がなく、呼び出している関数が正しく機能するために特定のthis値を期待していない場合。

キーワードを明示的に渡した方が明確ではないでしょうか。 または少なくとも人間が読めるもの。 それから、この時点で私はなぜあなたがnullを使うのか理解できないかもしれません。

あなたの特定のケースでは、おそらく渡すべき最も良いものはMathオブジェクトです:

function getMax(arr){
  return Math.max.apply(Math, arr);  
}

Math.max.apply(...)最初の引数として何を渡してもかまいませんがMath.max.apply(...) Math.max()実装仕様のためだけ)、 Mathを渡すとthisポインタは次のように設定されます。通常Math.max(1,2,3)ように呼び出すときに設定されるのとまったく同じことです。そのため、通常のMath.max()呼び出しをシミュレートするのが最も安全な方法です。

「適用」または「呼び出し」になぜ「null」を渡すのでしょうか。

.call()または.apply()を使用するとき、 thisポインタを設定したい特定の値がなく、呼び出している関数が.apply()ない場合はnullを渡すことができます。 thisに特定の価値があることを期待してください(例えば、実装ではthisを使用しません)。

注: .apply()または.call() nullを使用するのは、通常、オブジェクト指向の理由ではなく、名前空間の理由でのみメソッドである関数でのみ行われます。 言い換えると、関数max()は、名前空間の理由のためだけにMathオブジェクト上のメソッドであり、 Mathオブジェクトがメソッド.max()がアクセスする必要があるインスタンスデータを持っているからではありません。

あなたがこのようにしていたならば:

   function foo() {
       this.multiplier = 1;
   }

   foo.prototype.setMultiplier = function(val) {
       this.multiplier = val;
   }

   foo.prototype.weightNumbers = function() {
       var sum = 0;
       for (var i = 0; i < arguments.length; i++) {
           sum += (arguments[i] * this.multiplier);
       }
       return sum / arguments.length;
   }

   var x = new foo();
   x.setMultiplier(3);
   var numbers = [1, 2, 3]
   console.log(x.weightNumbers.apply(x, numbers));

あなたが.apply()を呼び出しているメソッドがインスタンスデータにアクセスする必要があるとき、あなたは最初の引数として適切なオブジェクトを渡さなければなりません。





javascript