ホームページ > ウェブフロントエンド > jsチュートリアル > evalを使用せずに文字列からJavaScript関数を呼び出す方法

evalを使用せずに文字列からJavaScript関数を呼び出す方法

Lisa Kudrow
リリース: 2025-02-22 10:40:10
オリジナル
757 人が閲覧しました

How to Call a JavaScript Function From a String Without Using eval

JavaScriptでは、

は良い考えではありません! mdnのevalページ:>この機能は時代遅れです。ブラウザは引き続きサポートしていますが、新しいプロジェクトでは推奨されていません。それを使用しないようにしてください。 eval

コードを含む文字列を実行します。たとえば、eval

eval("var x = 'Hello from eval!';");
console.log(x);
ログイン後にコピー
ログイン後にコピー

いくつかの問題が発生します:eval

  1. セキュリティ:文字列は、サードパーティのスクリプトまたはユーザー入力によって他のコマンドに挿入される場合があります。
  2. debug:エラーをデバッグするのは難しいです - ライン番号や明らかな障害ポイントはありません。
  3. 最適化:
  4. JavaScriptインタープリターは、それが変更される可能性があるため、必ずしもコードを事前互換化できるとは限りません。通訳はより効率的になっていますが、ほぼ確実にネイティブコードよりも遅くなります。
  5. 残念ながら、
は非常に強力で、経験の浅い開発者はこのコマンドを簡単に使いすぎることができます。警告にもかかわらず、

はまだ厳格なモードでも機能しますが、通常は避けることができます。過去には、主にJSONの文字列をゆるくするために使用されていましたが、今ではより安全なevalメソッドがあります。ただし、文字列に関数名がある場合、たとえば:eval JSON.parse

// 我们要运行的函数
var fnstring = "runMe";

function runMe() {
    // 执行操作
}
ログイン後にコピー
ログイン後にコピー
を使用せずに

関数をどのように実行するのですか?私は最近、HTML5 History APIを使用しているときにこれに遭遇しました。 Webワーカーまたはオブジェクトをシリアル化する他のAPIを使用する場合、同様の課題に直面する可能性があります。 eval runMe()pushStateのない最も簡単で安全な実装ソリューションは、次のような一連の条件です。

安全ですが、何十もの機能を呼び出したい場合は、書くのは非常に非効率的で頭痛がします。より良い解決策は、現在のウィンドウとそのすべてのアイテムを参照するevalオブジェクトを使用することです。

// 我们要运行的函数
var fnstring = "runMe";

switch (fnstring) {
    case "functionX": functionX(); break;
    case "functionY": functionY(); break;
    case "functionZ": functionZ(); break;
    case "runMe": runMe(); break;
}
ログイン後にコピー
でオブジェクトとして利用可能であるかどうかを確認できます。たとえば、それを実行してください。

window必要に応じて、追加のチェックを実行して、関数に予想される名前があることを確認できます。呼び出している関数にパラメーターがある場合はどうなりますか?おそらく配列に保存されていますか?問題ありません fnstring windowしたがって、これが

の使用を停止するもう1つの理由です。さらに、このソリューションはより安全で、エラーが少なく、デバッグが簡単で、実行が速くなることがよくあります。それがあなたを助けることを願っています。
// 我们要运行的函数
var fnstring = "runMe";

// 查找对象
var fn = window[fnstring];

// 对象是否为函数?
if (typeof fn === "function") fn();
ログイン後にコピー

FAQは、eval

を使用せずに文字列からJavaScript関数を実行することに関する

eval()を使用せずに、javaScript関数を文字列で呼び出すことの意味は何ですか?

JavaScriptの

eval()関数は、任意のコード文字列を実行できる強力なツールです。ただし、セキュリティとパフォーマンスの問題により、eval()を使用することはしばしば悪い慣行と見なされます。コードを注射攻撃に対して脆弱にすることができます。さらに、最新のJavaScriptエンジンはコードのパフォーマンスを最適化しますが、実行されたコードを最適化することはできません。したがって、eval()を使用せずに文字列を使用してJavaScript関数を呼び出す方法を知ることは非常に有益です。これは、より安全で効率的な代替品であるeval()オブジェクトまたはwindowコンストラクターを使用することで実現できます。 Function

オブジェクトを使用して、文字列を使用してJavaScript関数を呼び出す方法は? window JavaScriptの

オブジェクトは、ブラウザによって表示されるウィンドウを表します。これは、ブラウザ環境のグローバルオブジェクトであり、すべてのグローバル変数と関数がwindowオブジェクトの属性と方法になります。 windowオブジェクトを使用して、windowオブジェクトのプロパティとして関数にアクセスすることにより、文字列を使用して関数を呼び出すことができます。例は次のとおりです。window

このコードでは、 "Hello"はオブジェクトのプロパティであり、関数を参照しています。したがって、
eval("var x = 'Hello from eval!';");
console.log(x);
ログイン後にコピー
ログイン後にコピー

関数を呼び出します。 window hello()window["hello"]コンストラクターとは何ですか?文字列を使用して関数を呼び出すためにどのように使用しますか? hello() JavaScriptの

コンストラクターは、新しいFunctionオブジェクトを作成します。これはあまり一般的ではありませんが、機能を定義するためのまだ効果的な方法です。文字列をコンストラクターに渡すことにより、文字列を使用して関数を呼び出すために

コンストラクターを使用できます。例は次のとおりです。

Function このコードでは、Functionコンストラクターは、「a」と「b」という2つの引数を取得し、合計を返す新しい関数を作成します。パラメーターと関数本体は文字列として渡されます。 Function

関数がオブジェクトの何らかの方法である場合、文字列を使用して関数を呼び出すことはできますか?
// 我们要运行的函数
var fnstring = "runMe";

function runMe() {
    // 执行操作
}
ログイン後にコピー
ログイン後にコピー

はい、関数がオブジェクトの何らかの方法である場合でも、文字列を使用して関数を呼び出すことができます。これは、オブジェクトのプロパティにアクセスしてアクセスすることで行うことができます。これは、オブジェクトの処理方法に似ています。例は次のとおりです。Function

このコードでは、 "Hello"はオブジェクトのプロパティであり、メソッドを参照しています。したがって、

メソッドを呼び出します。

文字列を使用してJavaScript関数を呼び出すことの制限は何ですか?

文字列を使用してJavaScript関数を呼び出すと便利な場合がありますが、いくつかの制限もあります。 1つの制限は、グローバル関数または既知のオブジェクトの方法にのみ適用されることです。関数が既知のオブジェクトのプロパティではない場合、文字列で呼び出すことはできません。別の制限は、パラメーターを関数に直接渡すことができないことです。関数がパラメーターを受け入れる場合、それらを文字列に含めるか、他の関数を使用してそれらを渡す必要があります。これらの制限にもかかわらず、文字列を使用した関数を呼び出すことは、正しく使用すると強力なツールです。

以上がevalを使用せずに文字列からJavaScript関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート