問題タブ [function-constructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - Function コンストラクターの正当な使用
繰り返し述べたように、Function コンストラクターを使用することは悪い習慣と見なされます ( ECMAScript 言語仕様、第5版、§ 15.3.2.1も参照してください)。
(すべての引数は引数名を含む文字列であり、最後の (または唯一の) 文字列には関数本体が含まれます)。
要約すると、Opera チームによって説明されているように、遅いと言われています。
[…] コンストラクターがソース コードを表す文字列に対して呼び出されるたび
Function
に、スクリプト エンジンは、ソース コードを実行可能コードに変換する機構を開始する必要があります。これは通常、パフォーマンスの面でコストがかかります。たとえば、単純な関数呼び出しよりも簡単に 100 倍のコストがかかります。(マーク 'ターキン' ウィルトン ジョーンズ)
MDC のこの投稿によると、それほど悪くはありませんが(ただし、現在のバージョンの Firefox を使用して自分でテストしたわけではありません)。
クロックフォードは、次のように付け加えています。
[t]言語の引用規則により、関数本体を文字列として正しく表現することが非常に困難になります。文字列形式では、初期エラー チェックを実行できません。[…] そして、各関数は独自の独立した実装を必要とするため、メモリの無駄です。
もう一つの違いは、
Function コンストラクターによって定義された関数は、(すべての関数が継承する) グローバル スコープ以外のスコープを継承しません。( MDC )
new Function
これとは別に、動的コンテンツを使用して作成する場合は、悪意のあるコードが挿入されないように注意する必要があります。
そうは言っても、TJ Crowder は答えで次のように述べています。
[t]同様の […] new Function(...) が必要になることはほとんどありません。これも高度なエッジ ケースを除きます。
それで、今、私は疑問に思っています: これらの「高度なエッジケース」とは何ですか? Function コンストラクターの正当な使用法はありますか?
javascript - JSOOP。継承とapply()関数。なぜそれが機能しないのですか?
そのような例があります。
今、私は同じ方法でバーからFooのすべてにアクセスしたいと思っています。コードを変更します:
しかし、出力はありません。私は実際にいくつかの間違いが発生します。Foo.apply(this, arguments);
コメントの下に隠れると、呼び出しalert(fooObj.barVal);
は再び機能します。私がこのようにそれをチェックするとき:
ブラウザの動作も停止します(私はChromeを使用しているため、ピクセルフォルダが表示された画面全体が表示されます)。そしてアラートウィンドウに書き込みますRangeError: undefined
しかし、私はこのシーケンスでアラートコールを持っているので
2番目のアラートは、私がそれから待っているものを正確に示しています-それはを示していますBarValue
。
Barで複製するとapply()が機能しないのはなぜですか?どういうわけか、2つの機能の間にそのような種類のゲートを作ることは可能ですか?
javascript - JavaScript の void、eval、および Function コンストラクターの違いは何ですか?
これらの異なるステートメント内でコードを実行するための処理モデルは何ですか?
javascript - JS の関数によっては、prototype.constructor prop があり、他の関数にはないのはなぜですか? これらの機能の違いは何ですか?
JS のすべての関数コンストラクターにはprototype.constructor
プロパティがあります。そして、関数の定義を保存します:
ここで、関数コンストラクターではなくthis
、本体に何もない単純な関数をチェックします。
ここで、組み込みArray()
関数を確認します。
そして今、組み込みオブジェクトの組み込み関数を確認したいと思います:
sort
ありませんprototype
。それはどこにある?そして、そのコンストラクターはどこにありますか?
javascript - CSPを使用するWebワーカーで「新しい機能」を有効にする
new Function
Webワーカーで作業するのに問題があります。Webワーカーを生成するHTMLページがあります。このWebワーカーは、を介してコードを実行しますnew Function(str)
。これをパッケージ化されたChromeアプリで使用しようとしています。このアプリでeval
は、マニフェストにサンドボックス化されたページとして明示的にリストされるようなコードを使用するページが必要です。
現在、2つのオプションがあります。
- サンドボックス化するページをリストしてください。そうすれば、を使用できます
new Function
が、要求を行うことができないため、Webワーカーを生成できません(サンドボックス化されたページには固有のオリジンがあります)。new Worker(...)
をスローしSECURITY_ERR
ます。new Function
サンドボックスで動作しますnew Worker
固有の起源のためにサンドボックスで失敗する
- サンドボックス化するページをリストしないでください。そうすれば、Webワーカーを生成できますが、
new Function
サンドボックス化されていないため、ワーカーは使用できません。それの使用について不平をnew Function(...)
投げます。EvalError
new Function
eval
のようなものであるために非サンドボックスで失敗するnew Worker
サンドボックス以外で動作します
私のCSPは次のとおりです。
new Function
Webワーカーで作業するにはどうすればよいですか?
javascript - 関数/オブジェクトを呼び出すコンテキストを取得するには?
呼び出し元の関数のコンテキスト (上記のコードでコメントされているインライン) を取得する方法はありますか?
これにバインドし(コメントを に置き換えますthis
)、F
コンストラクター内で宣言すると、正常に動作しますvar def = define.bind(this);
javascript - JS 関数コンストラクターは毎回再解析されますか?
MDN では、Functions と function scopeについて、評価されるたびに解析されるとはどういう意味ですか? これはコードで確認できますか?
セクション関数コンストラクター対関数宣言対関数式の引用:
関数式および関数宣言によって定義された関数は一度だけ解析されますが、Function コンストラクターによって定義された関数は解析されません。つまり、 Function コンストラクターに渡される関数本体の文字列は、評価されるたびに解析する必要があります。関数式は毎回クロージャーを作成しますが、関数本体は再解析されないため、関数式は「new Function(...)」よりも高速です。したがって、Function コンストラクターは可能な限り避ける必要があります。
ただし、Function コンストラクターの文字列を解析することによって生成された関数内にネストされた関数式および関数宣言は、繰り返し解析され ないことに注意してください。例えば:
var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
私はそれをテストして理解する(しようとする)コードスニペットを書きました:
どちらも「再度バージョン」を警告します。
再解析されたかどうかはどういう意味ですか?
これはコードの結果で説明できますか?
ありがとう。
参考までに、別のコード スニペットを試しました。
両方のアラートは、「FOO! again more」ではなく、「FOO! again」です。
javascript - Javascript: 配列内のすべてのオブジェクトにメソッドを追加します
次のコードを想像してください。
「データ」の値は次のとおりです。
質問1
ここで、データをダウンロードした後、配列内のすべてのエントリにメソッド「colorStartsWithR」を追加するとします。配列のすべてのメンバーで定義するのではなく、プロトタイプでこのメソッドを何らかの方法で定義できると「思います」。しかし、これらのオブジェクトは私が作成したものではなく、$.get によって返されたものであるため、それができるかどうかはわかりません。正しい方向に考えているかどうかはわかりません。
質問2
もう少し詳しく説明すると、配列のすべてのメンバーにプロパティを追加したい場合、具体的には次のようになります。
このようにして、(knockoutjs を介して) リストをバインドし、チェックボックスを含めることができます。この場合、各メンバーが独自の ko.observable プロパティを取得する必要があるため、プロトタイプが役立つかどうか疑問に思います。素早い本能は、次のようなことをすることです:
それは問題なく動作しますが、色のリストを取得する方法が複数あること、またはユーザーが新しい色インスタンスを作成できること、および上記で行ったカスタマイズがより複雑であると想像してください。上記の「アドオン」ロジックを複製する必要があります。よりスマートな方法はありますか?
強く型付けされた言語でほとんどの時間を費やしてきたので、これらのことは私には明らかではないことがあります。提案をありがとう...
-ベン
javascript - javascript コンストラクター関数を作成する際の構文エラー
javascriptで次のようにコンストラクタ関数を作成しようとしています。しかし、私はエラーが発生します:
SyntaxError: 予期しないトークン ILLEGAL
クロム開発者ツールコンソールで次を実行すると、これが得られます。
同じ構文エラーがありますか。そうでない場合、エラーの原因は何ですか。