0

これはこれまでで最も紛らわしいことです。タイトルはおそらくあまり意味がありません。私は最善を尽くしました。私が明確にできることを願っています。わかりました、私はグーグルチャンネルAPIからのtic-tac-toeの例を見ています。

javascriptの部分で。

彼らはこのようなものを持っています。

sendMessage = function(param) {
  alert(param);
  //this part actually sends message to server, 
  //for simplicity lets assume it pops up alert.    
  }

init = function(){
  var input = 3;
  var submitButton = document.getElementById('submitButton');
  submitButton.onclick = new Function('sendMessage(' + input + ')');
}

setTimeout(init, 100);

これによりアラートがポップアップし、3が出力されます。これがどのように機能するかわかりません。しかし、それは機能します。それを説明できれば、それも素晴らしいことです。このような新しいFunction()の使用法は他に見つかりませんでした。

問題は、入力が文字列の場合、

var input = "test";

これは機能せず、ポップアップするアラートはありません。

説明と助けてくれてありがとう。

4

3 に答える 3

1

Functionコンストラクターは、eval引数を関数本体として使用することで機能します。

... = new Function('sendMessage(' + input + ')');

と類似しています

... = eval("function(){sendMessage("+input+")}";

数値inputの場合、テキスト表現は数値リテラルとして機能するため、これは機能します。テキスト入力の場合はそうではありません。を行うことで限定的なサポートを得ることができます

... = new Function('sendMessage("'+input+'")');

より一般的な方法は、

... = new Function('sendMessage("'+JSON.stringify(input)+'")');

ただし、非常に古いブラウザ(IE <8)には存在しないオブジェクトevalの形式や依存関係を回避するために、代わりに即時呼び出し関数式(IIFE)を使用することをお勧めします。JSON

... = (function(input){
  return function(){
    sendMessage(input)
  }
})(input)

または、input変数が変更されない場合は、その値をキャプチャする必要はありません。

... = function(){ sendMessage(input) }

または、sendMessage内で使用しない場合はthis、次を使用できますbind(IE8にはシミングが必要です)。

... = sendMessage.bind(undefined, input)
于 2013-02-16T07:39:37.720 に答える
0

入力が文字列の場合、関数呼び出しは次のようになります。

sendMessage(string)

これは実際には次のようになります:

sendMessage("string")また sendMessage('string')

sendMessage = function(param) {
  alert(param);   
  }

init = function(){
  var input = '"string"';
  var submitButton = document.getElementById('submitButton');
  submitButton.onclick = new Function('sendMessage(' + input + ')');
}

setTimeout(init, 100);

これがあなたがどのように使うことができるかを見るためのフィドルです。

于 2013-02-16T07:28:54.507 に答える
0

関数へのパラメータが評価されます。つまり、実行されます。それが機能する理由です。

文字列を渡すと、渡した文字列が文字列ではなくオブジェクトまたは変数として扱われるため、機能しませんでした。そして、文字列が存在しないことは誰もが知っています。

すなわち

これは機能します:

submitButton.onclick = new Function('sendMessage(3)');

これはしません:

submitButton.onclick = new Function('sendMessage(test)'); //because test does not exist

しかし、これは

submitButton.onclick = new Function('sendMessage("test")');

したがって、コードを次のように変更すると、次のようになります。

submitButton.onclick = new Function('sendMessage("' + input + '")');

その後、すべてが順調です

于 2013-02-16T07:37:56.387 に答える