ホームページ  >  に質問  >  本文

javascript - apply() と call() に関する質問

リーリー

質問:
1.sum.apply(this,arguments) は、apply メソッドを呼び出すオブジェクト sum を指します。これは、同じスコープ内で実行される callSum() と sum() を指します。arguments は、「sum1」を指します。 、和2」?
2. プロジェクト内の apply() と call() の適用値は何ですか?

滿天的星座滿天的星座2663日前1135

全員に返信(5)返信します

  • 淡淡烟草味

    淡淡烟草味2017-07-05 11:03:57

    上に書かれていることは本当に複雑です:)

    質問者が何に迷っているか聞いてください
    1:

    リーリー

    arguments は、関数に渡される引数に対応する配列のようなオブジェクトです。引数オブジェクトは、すべての関数で使用できるローカル変数です。引数オブジェクトを使用して、関数内で関数の引数を参照できます。

    追記: this のポイントは、関数が定義された時点では決定できません。実際、this の最終ポイントは、それを呼び出すオブジェクトです

    2. call と apply のアプリケーション値 (存在意味):

    関数は、関数の実行時コンテキストを変更するために存在します。 それは、関数本体内で this のポインティングを変更することです
    「端的に言うと、a には xx メソッドがありますが、b にはありません。B は a にそれを借りることができます (これは単なる継承ではありませんか~)

    呼び出しと適用の違い:

    パラメータの受け取り方法が異なります。

    次のように:
    call は連続パラメータを受け入れ、apply は配列パラメータを受け入れます。
    A.call(this, a,b,c,d)
    A.apply(this, [a,b,c,d])

    ポータル: http://www.jianshu.com/p/a7b1...

    返事
    0
  • typecho

    typecho2017-07-05 11:03:57

    1. arguments は function の組み込み属性の 1 つで、関数配列オブジェクトを表します。つまり、callSum1 の引数は num1 と num2 を参照します
      https://developer.mozilla.org...

    2. apply と call の価値は、指定された関数内の this が特定のオブジェクトを指すようにできることです。たとえば、document.querySelectorAll() を使用して取得した dom は、実際には配列ではなく、配列のようなオブジェクトになります。配列メソッド、次のようになります

    リーリー

    apply と call の主な違いはパラメータの形式です。この質問については MDN を確認することをお勧めします。

    返事
    0
  • 巴扎黑

    巴扎黑2017-07-05 11:03:57

    1.sum.apply(this,arguments) は、apply メソッドを呼び出すオブジェクト sum を指します。これは、両方とも同じスコープ内で実行される callSum() と sum() を指します。

    2. プロジェクト内の apply() と call() の適用値は何ですか?

    1 つの実行結果については両方が返されます 20 20

    sum.apply(this,arguments)は、sumを呼び出すためにapplyを使用することを指します。以下の引数は、配列のようなオブジェクトです。

    sum.apply(this,[num1, num2]) 上記と同様。

    議論については、スクリーンショットを投稿してください。そうすれば、感覚的に理解できるかもしれません


    2点目に対する答えは以下の通りです

    これを厳選しました

    わかりやすいです。たとえば、Ajax リクエストの成功コールバック中にこのポインタを変更するだけです

    例えばvueを開発する際、アロー関数が無い場合はvar that = thisを使って一時的に保存する必要があります。 これを厳選できれば、このような問題は発生しません

    栗をください

    リーリー

    配列のようなオブジェクトを真の配列に変換する

    arguments は、関数のパラメータリストを配列のようなオブジェクトの形式で保存します。

    リーリー

    実際、ここからわかるように、スライスを実行するには、オブジェクトが通常に実行して結果を返すために length 正确的下标 を持つ必要があるだけです。

    配列の多くのメソッドは配列のようなオブジェクトで使用できるため、多くの場合、配列のようなオブジェクトは実際に配列と見なすことができます。

    リーリー


    配列のようにすることもできます

    リーリー

    本当に配列のようなオブジェクト

    部分関数を実装する 部分関数

    次のような数学の部分関数に似ています:

    機能f(x, y) = x + y
    如果令 y = k 那么可以得到偏函数 f(x, k) = x + k
    ( 或者这样可能更好理解: f(x, 4) = x + 4)

    Bind は通常、部分的な関数を実装するために使用されます。 ただし、apply、call、bind については集中的に議論する必要があります。

    リーリー

    上記を実現するには apply を使用します logger は次のとおりです:

    リーリー

    高階関数とカリー化

    高階関数とは、一般に、戻り値が関数であるか、パラメーターが関数である関数を指します。

    setTimeout は良い例です。パラメータ (通常は関数) を受け取り、一定の遅延の後にそれを実行します。
    しかし、これを渡した後、これは通常、グローバルオブジェクトウィンドウを指します。これを指定したい場合は、apply と binding を使用する必要があります。

    上記の logger2 はこれを実行し、関数を返します


    カリー化について、まず関数を見てみましょう

    add リーリー


    パラメータを 1 つずつ渡すことができる場合、2 番目のパラメータに渡されたときに結果が取得されます。 リーリー

    最初の実行は関数を返します。add を数学的な意味で関数とみなすと、それは

    なので、部分関数

    が得られます。 f(x, y) = x + y 我们执行了一次 add(1) 得到 add1 其实就是令 x = 1

    f(1, y) = 1 + y y を 2 回目に実行すると、実際の値が得られ、結果は式を使用して計算できます。

    これは実際には段階的な消去プロセスです。

    何のためにあるの?

    私は関数型プログラミングの初心者で、まだ本質を理解していません。カリー化の唯一の利点は

    パラメータが十分に与えられるまで、今の操作は実行されないということです。

    惰性求值
    私は一晩中起きていて、SF を閲覧することしかできませんでした。 。 。 。

    返事
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-07-05 11:03:57

    スコープを手動で設定します。 this

    返事
    0
  • 迷茫

    迷茫2017-07-05 11:03:57

    百度で検索したら分かります。

    返事
    0
  • キャンセル返事