javascript - jsでのcallメソッドの実装
PHP中文网
PHP中文网 2017-06-12 09:30:07
0
3
788
リーリー

は呼び出しの実装をシミュレートするためですが、なぜ文字列をプッシュしてから次に eval を使用する必要があるのでしょうか? argument[i] を直接渡してから context.fn(args) を使用してみてはいかがでしょうか?

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信 (3)
给我你的怀抱

ここでは、call的原理,这里我简要还是说明一下原理,我也是参考JavaScript権威あるガイドの指示も理解し、それをコードで実装したと思います。

まず、中国語版の ECMAScript 仕様から、callの構文と定義を見てみましょう:

簡単な例を挙げてみましょう:

リーリー

次に、callを使用した後の出力を見てください:

リーリー

栗に基づいて以下の質問に答えます:

call的实现,请问为什么要push一个字符串,下面再用eval?直接传入arguments[i],然后下面用context.fn(args)の実装をシミュレートするためです。なぜ文字列をプッシュして次にeval を使用する必要があるのでしょうか?arguments[i]を直接渡してから、context.fn(args)を使用するのはなぜでしょうか?

まず第一に、上でシミュレートした関数とチェストナット内の変数の間の関係を理解する必要があります:

リーリー

このステップに注目してください。jawil.sayHello的引用地址给了lulin.sayHello

を入れただけです

判明しましたjawil.sayHello.call(context,arg1,arg2,arg3,arg4)

自分の道を切り開いてくださいcontext得到args=[arg1,arg2,arg3,arg4]

それでは、lulin.sayHello([arg1,arg2,arg3,arg4])を実行してください。はは、とてもわかりにくいですよね。見た目は問題ありませんが、実際には 4 つのパラメータがあり、それらが 1 つの配列に結合され、1 つの配列パラメータになっていることがわかります。ここに問題があります。

それでは、この問題をどのように解決するのでしょうか? 考え方は上記の通り、すべてのパラメータを文字列に入れてからevalを使用して実行します。

必要なエフェクトはlulin.sayHello(arg1,arg2,arg3,arg4)です。lulin.sayHelloはパラメータを再編成する必要があるため、パラメータを取得することはできませんlulin.sayHello(arg1,arg2,arg3,arg4)这样的,因为lulin.sayHello要重组参数,你不能拿到一个参数执行一次函数吧,或者把参数存到一起一次执行吧,唯一的想到的做法就是把所有参数拼成字符串,然后用evalパラメータを指定して関数を 1 回実行する

か、パラメータをまとめて保存して 1 回実行する

唯一の方法は、すべてのパラメータを文字列に入れてからlulin.sayHello([arg1,arg2,arg3,arg4]),也不是lulin.sayHello(arg1),lulin.sayHello(arg2)を使用して実行することです。

これと同様: "lulin.sayHello(arg1,arg2,arg3,arg4)" これは、

lulin.sayHello(arg1)lulin.sayHello ではなく、私たちが望む方法です。 (arg2)...

eval とは何ですか? ここでは、何も知らないことにして簡単に説明します。eval
関数

の定義と使用法を簡単に見てみましょう

eval() 関数は文字列を計算し、その中の JavaScript コードを実行できます。


文法:eval(string)

文字列が必要です。評価する JavaScript 式または実行するステートメントを含む、評価する文字列。このメソッドはパラメータとして生の文字列のみを受け入れます。文字列パラメータが生の文字列でない場合、メソッドは変更されずに戻ります。したがって、String オブジェクトを引数として eval() 関数に渡さないでください。

簡単に言うと、JavaScript の解析エンジンを使用してこの文字列の内容を解析します。eval看成是