1

実行時にJS関数のコードを置き換える方法は? (C++ 関数ポインターと同じ機能)

を試しeval()ましたが、パラメータの 1 つに 13 や 10 などのバイト値が含まれていると、エラーがスローされます。

このことから、eval は実際にはすべての字句アトムを評価し、それらをその内容に置き換えていることがわかります。

これらは、私が探している機能を説明するためのサンプル ファイルです。


ファイル 1: index.html

xmlhttp=new XMLHttpRequest();   
xmlhttp.open("GET","dynamic_code.php",false);
xmlhttp.send();
var dynamic_code=xmlhttp.responseText;
function dynamic_function (){
    eval(dynamic_code)
}
dynamic_function ()

ファイル 2: dynamic_code.php

some_file=new XMLHttpRequest(); 
some_file.open("GET","some_file.txt",false);
some_file.send();
var some_file_content=some_file.responseText;
alert(some_file_content);

ファイル 3: some_file.txt

line1
line2
line3

ブラウザから返されたエラー:

> Uncaught exception: SyntaxError: at line 2, column 0: expected
> expression, got '<' Error thrown at line 12, column 4 in
> dynamic_function() in http://my_ip/dummy/index.html:
>     eval(dynamic_code) called from line 15, column 0 in http://my_ip/dummy/index.html:
>     dynamic_function ()
4

1 に答える 1

0

これは、C++ 関数ポインタと同じ機能ではありません :-)

これは同じです:

function someFunc() {
}

function otherFunc(f) {
    f();
}

otherFunc(someFunc);

そしてそれは機能します:) Javascriptにはファーストクラスの機能があります。(C++ は関数ポインターでエミュレートします。)

あなたがやろうとしていることは、C++ では次のようになります。

void someFunc(f) {
    eval(f); // doesn't exist of course
}

someFunc("void otherFunc() {}");

真実が確立されたので、問題に戻りましょう。

あなたが探しているのはJSONPと呼ばれるものです。これは、ブラウザにスクリプト タグを挿入する手法です。スクリプトが挿入されると、内部の JavaScript コードが実行されます。これが使用される主な理由は、クロスドメインで動作するためです。これには XHR は必要ありません。ただし、ユースケースに使用することもできます。

于 2012-10-23T09:37:31.130 に答える