javascript - 意味 - js page title




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

「適用」または「呼び出し」になぜ「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のリファレンスによると:

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

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

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


これが便利だと思うケースの1つは、呼び出している関数がすでに特定のコンテキストにバインドされているときです。

バインドされた関数は再バインドできず、 bindに渡されたthisArgを使用してthisArgれるため、 thisArgcallまたはapplyに渡してもthisArgがありません。 sourceから:

bind()関数は、新しい束縛関数(BF)を作成します。束縛関数が呼び出されると、 [[BoundTargetFunction]]内部メソッド[[Call]]を次の引数Call(boundThis, args)ます。

これが一例です。

class C {
  constructor() {
    this.a = 1;
  }
}

function f(n, m) {
  console.log(this.a + n + m);
}

let c = new C();
var boundF = f.bind(c, 2); // the context `c` is now bound to f
boundF.apply(null, [3]); // no reason to supply any context, since we know it's going to be `c`

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

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

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

fun.apply(thisArg, [argsArray])

thisArg

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

さらなる文書はhere


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

JavaScriptのnullは何ですか?

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

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

fun.apply(thisArg、[argsArray])

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

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

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





javascript