パラメータをsetTimeout()コールバックに渡すにはどうすればよいですか?


825

次のようなJavaScriptコードがあります。

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

topicId定義されていないエラーが発生するsetTimeout()関数を使用する前にすべてが機能していました。

私は自分の欲しいpostinsql(topicId)機能がいくつかの時間後に呼び出されます。私は何をすべきか?


75
そのような古いトピックについては少しコメントが痛いですが、3番目のバージョンを提供する必要があります(私の意見でははるかにきれいです):setTimeout(postinsql.bind(null、topicId)、4000)
Hobblin

14
@ホブリン:なぜ記録を正直に設定するのが悪いのか?このポピュラーな質問にたどり着き、古くて目立たなくなった通話スタイルを見ることは、他の人を傷つけませんか?
Dan Dascalescu、2015

2
すべてがここで明確です:w3schools.com/jsref/met_win_settimeout.asp
Vladislav

私の提案は、すでに答えのいくつかに言及し、ここでの答えとして追加されました@dbliss:stackoverflow.com/a/15620038/287130 しかし、私は私の提案が高く評価されてうれしい;)
Hobblin

@ホブリンああ、それを指摘してくれてありがとう。私はあなたが投稿した答えを探してスクロールして、それを逃しました。
dbliss 2016年

回答:


1122
setTimeout(function() {
    postinsql(topicId);
}, 4000)

匿名関数を文字列ではなくパラメーターとしてフィードする必要があります。後者の方法はECMAScript仕様に従って機能しないはずですが、ブラウザーは寛大です。これは適切な解決策です。setTimeout()またはを使用するときに文字列を「関数」として渡すことに依存しsetInterval()ないでください。評価する必要があり、正しくないため、速度が遅くなります。

更新:

Hobblin が質問へのコメントで述べたように、を使用してsetTimeout内の関数に引数を渡すことができますFunction.prototype.bind()

例:

setTimeout(postinsql.bind(null, topicId), 4000);

30
window.setTimeoutDOMメソッドであるため、ECMAScript仕様では定義されていません。文字列を渡すことは常にブラウザで機能しており、事実上の標準です。実際、関数オブジェクトを渡す機能はJavaScript 1.2で後で追加されました。これは明示的にHTML5ドラフト仕様(whatwg.org/specs/webの一部です)-apps / current-work / multipage /…)。ただし、関数オブジェクトの代わりに文字列を使用することは、本質的には遅延の形式であるため、一般的にスタイルが悪いと見なされますeval()
マイル

2
var temp = setTimeout(function(){postinsql(topicId);}、4000); clearTimeout(temp); ??
Josh Mc

12
タイムアウトが設定された後、関数が呼び出される前にtopicIdが変更されるとどうなりますか?
pilau

22
@pilauそれがまさに私の問題です。無名関数で使用されている変数がタイムアウト前に変更された場合(forループなど)、関数内でも変更されます。したがって、私の例では、forループで5つの異なるタイムアウトを設定すると、実際には同じ変数が使用されます。この回答を使用するときは注意してください!
クリスティアン2013年

10
@pilauが別のクロージャーを使用すると、topicId = 12に役立ちます。function postinsql(topicId){console.log(topicId); } function setTimeOutWithClosure(topicId){setTimeout(function(){postinsql(topicId);}、1000)} setTimeOutFunction(topicId); topicId = 13;
HalisYılboğa2013

727

最近のブラウザーでは、「setTimeout」は、タイマーの最後に内部関数にパラメーターとして送信される3番目のパラメーターを受け取ります。

例:

var hello = "Hello World";
setTimeout(alert, 1000, hello);

詳細:


56
なぜこの回答がベストに選ばれなかったのかわかりません。無名関数の使用は確かに機能しますが、3番目のパラメーターを元のsetTimeout関数呼び出しに単に渡すことができる場合は、どうしてでしょうか。
Kris Schouw

54
それは、IEのバージョンではまだ機能しないためです。
アーロン

4
この回答により、実際にイベントオブジェクトを渡すことができましたが、他のメソッドではできませんでした。私はすでに匿名の関数を持っていました。
Glenn Plas

27
はるかに良い答え。「setTimeout」呼び出しと無名関数の実際の実行の間にパラメーターを変更するコードがある場合、無名関数は、setTimeout呼び出し時の値ではなく、変更された値を受け取ります。例:for(var i = 0; i <100; i ++){setTimeout(function(){console.write(i);}、0); }「100」を100回記録します(FFでテスト済み)。現在の答えはこれを回避するのに役立ちます。
ルート

1
た内容に応じて、developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout 多くのサイトでIE8とIE9はまだいくつかの関連する株式を取得すると、Internet Explorer用のコールバック引数は唯一のバージョン> = 10でサポートされて、気をつけなります。
le0diaz

154

いくつかの調査とテストを行った後、正しい実装は次のとおりです。

setTimeout(yourFunctionReference, 4000, param1, param2, paramN);

setTimeoutはすべての追加パラメーターを関数に渡し、そこで処理できるようにします。

無名関数は非常に基本的なもので機能しますが、「this」を使用する必要があるオブジェクトのインスタンス内では、機能させる方法がありません。匿名関数は「this」をwindowを指すように変更するため、オブジェクト参照を失います。


24
私が知らなければならないのは心の悲しみです。これはInternet Explorerでは機能しません。:/すべての追加のパラメーターは未定義として渡されます。
アマルゴビナス

6
私はただ使用しますvar that = this; setTimeout( function() { that.foo(); }, 1000);
エドウィリアムズ

2
これは正しく、HTML5で指定されています。 whatwg.org/specs/web-apps/current-work/multipage/…–
Garrett

4
これは、ファビオの答えとまったく同じです。
Dan Dascalescu、2015

1
た内容に応じて、developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout 多くのサイトでIE8とIE9はまだいくつかの関連する株式を取得すると、Internet Explorer用のコールバック引数は唯一のバージョン> = 10でサポートされて、気をつけなります。
le0diaz

45

これは非常に古い質問であり、すでに「正しい」回答が含まれていますが、ここでは誰も言及していない別のアプローチについて触れておきたいと思います。これは、優れたアンダースコアライブラリからコピーして貼り付けます。

_.delay = function(func, wait) {
  var args = slice.call(arguments, 2);
  return setTimeout(function(){ return func.apply(null, args); }, wait);
};

あなたがsetTimeoutメソッドによって呼び出される関数に好きなあなたは多くの引数として渡すことができますし、追加ボーナス(まあ、通常ボーナス)あなたがsetTimeoutメソッドを呼び出すときに、あなたの関数に渡される引数の値が凍結しているとして、彼らは値を変更するそうだとすれば、 setTimeout()が呼び出されてからタイムアウトするまでの間のどこかで、まあ...それはもうそれほどひどくイライラすることはありません:)

これが私の意味を理解できるフィドルです。


7
その答えは実際には機能しますが、私にはないライブラリがあるようです。これが機能するための小さな修正を以下に示します。slice.callの代わりに、Array.prototype.slice.call(arguments、2)を使用してください
Melanie

7
@メラニー「いくつかのライブラリ」?-私はそれがアンダースコアライブラリだとの回答で述べたunderscorejs.org。しかし、はい、Array.prototype.sliceはそのライブラリ内でスライスするようにエイリアスされているため、それを使用しない場合は自分で行う必要があります。良い点:)
David Meister

38

最近setTimeoutループ内で使用する必要があるという独特の状況に遭遇しました。これを理解すると、にパラメータを渡す方法を理解するのに役立ちますsetTimeout

方法1

Sukimaの提案に従って、forEachおよびを使用します。Object.keys

var testObject = {
    prop1: 'test1',
    prop2: 'test2',
    prop3: 'test3'
};

Object.keys(testObject).forEach(function(propertyName, i) {
    setTimeout(function() {
        console.log(testObject[propertyName]);
    }, i * 1000);
});

この方法をお勧めします。

方法2

使用bind

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }.bind(this, propertyName), i++ * 1000);
}

JSFiddle:http ://jsfiddle.net/MsBkW/

方法3

または、forEachまたはbindを使用できない場合は、IIFEを使用します

var i = 0;
for (var propertyName in testObject) {
    setTimeout((function(propertyName) {
        return function() {
            console.log(testObject[propertyName]);
        };
    })(propertyName), i++ * 1000);
}

方法4

しかし、IE <10に関心がない場合は、Fabioの提案を使用できます。

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }, i++ * 1000, propertyName);
}

方法5(ES6)

ブロックスコープ変数を使用します。

let i = 0;
for (let propertyName in testObject) {
    setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
}

ES6での使用Object.keysをお勧めしforEachますが。


2
注:.bindIE8以下では機能しません[参照:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ]。最終的には、Schienのソリューションを使用することになりました:stackoverflow.com/a/21213723/1876899
cjspurgeon

1
を使用bindする環境にいる場合はObject.keys、およびを提供する環境にもありますforEach。forループを緩めて、プロセスで「フリー」(リソースフリーではなく、1つのストーンフリーの2羽の鳥のように)関数スコープを取得できます。
スキマ14

@David Sherretがこれまでに使用したことがない場合は、必ずasyncライブラリをチェックしてください(github.com/caolan/async)。Sailsで幅広く使用しており、過去2年間で素晴らしい結果を残しています。これは、両方の平行で非同期のための一連のメソッドを提供forEachmapreduce、など
mikermcneil

25

ホブリンはすでにこれについてコメントしましたが、本当に答えになるはずです!

これを行うにFunction.prototype.bind()は、最もクリーンで柔軟な方法を使用します(thisコンテキストを設定できるというボーナスが追加されます)。

setTimeout(postinsql.bind(null, topicId), 4000);

詳細については、次のMDNリンクを参照して
ください 。https//developer.mozilla.org/en/docs/DOM/window.setTimeout#highlighter_547041 https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Function / bind#With_setTimeout


このコンテキストはbindの最初の引数で渡すことができますsetTimeout(postinsql.bind(this, topicId), 4000);
Giuseppe Galano

@GiuseppeGalano完全に、私は私の答えでそれを述べましたが、この例では必要ありません:)
dain

を使用した部分的なアプリケーションに対する光沢の数が魅力的ですbind。それは本当にいくつかの読みやすいコードになります。
スキマ14

bind()はIE9 +からのみサポートされているため、このアプローチは<IE9
Sanjeev

@Sanjeev ES5シムを使用して古いIEで動作させる:github.com/es-shims/es5-shim
gregers

17

一部の答えは正しいですが、複雑です。

4年後、私はこれにもう一度答えます。この質問を正確に解決するために過度に複雑なコードにまだ遭遇しているからです。エレガントなソリューションがあります。

まず、setTimeoutを呼び出すときに最初のパラメーターとして文字列を渡さないでください。これは、遅い "eval"関数の呼び出しを効果的に呼び出すためです。

では、タイムアウト関数にパラメーターを渡すにはどうすればよいでしょうか。クロージャを使用することにより:

settopic=function(topicid){
  setTimeout(function(){
    //thanks to closure, topicid is visible here
    postinsql(topicid);
  },4000);
}

...
if (xhr.readyState==4){
  settopic(xhr.responseText);
}

タイムアウト関数を呼び出すときに匿名関数を使用することを提案している人もいます:

if (xhr.readyState==4){
  setTimeout(function(){
    settopic(xhr.responseText);
  },4000);
}

構文はうまくいきます。しかし、settopicが呼び出されるとき、つまり4秒後には、XHRオブジェクトは同じではない可能性があります。したがって、変数事前にバインドすることが重要です


1
可読性の高いソリューションの場合は+1、私のものとは少し異なります。setTimeout関数内にsetTimeoutがあるのに、setTimeout関数内にfDelayed(あなたのsettopic)関数があります。
ドミニク

11

私の答え:

setTimeout((function(topicId) {
  return function() {
    postinsql(topicId);
  };
})(topicId), 4000);

説明:

作成された無名関数は、別の無名関数を返します。この関数は、最初に渡されたにアクセスできるtopicIdため、エラーは発生しません。最初の無名関数がすぐに呼び出されて渡されますtopicId。そのため、遅延のある登録された関数は、topicId呼び出し時にクロージャーを介してアクセスできます。

または

これは基本的に次のように変換されます:

setTimeout(function() {
  postinsql(topicId); // topicId inside higher scope (passed to returning function)
}, 4000);

編集:私は同じ答えを見たので、彼を見てください。しかし、私は彼の答えを盗みませんでした!見忘れた。説明を読み、コードの理解に役立つかどうかを確認します。


これが最良の答えです。これらのソリューションの多くは、タイムアウトを守らないこともあります。しかし、なぜ最初の無名関数を括弧で囲んでいるのですか?私は彼らがこれを達成するために必要だとは思いません。
ロバートヘンダーソン

これが最良の答えです👍、などtopicIdの値が変更されると、タイムアウトの値も変更されるため、クローンを作成する必要がありました。クローンが修正しました
18

10

交換する

 setTimeout("postinsql(topicId)", 4000);

 setTimeout("postinsql(" + topicId + ")", 4000);

またはより良い、文字列式を無名関数に置き換えます

 setTimeout(function () { postinsql(topicId); }, 4000);

編集:

ブラウンストーンのコメントは正しくありません。これは、Firebugコンソールでこれを実行することにより示されるように、意図したとおりに機能します

(function() {
  function postinsql(id) {
    console.log(id);
  }
  var topicId = 3
  window.setTimeout("postinsql(" + topicId + ")",4000); // outputs 3 after 4 seconds
})();

setTimeoutこれは文字列を呼び出しeval()、代わりに関数を渡すため、文字列を渡すことは避けてください。


postinsql(topicId)の結果はsetTimeoutによって実行されるため、これは機能しません。最初の回答と同じように関数でラップするか、プロトタイプの.curry()-setTimeout(postinsql.curry(topidId)、4000);などのヘルパーを使用する必要があります。
shuckster 2009

2
@brownstone:不正解です。文字列は、タイムアウトが発生したときに評価されます。
マイル

9

次のように、パラメータをsetTimeoutコールバック関数に渡すことができます。

setTimeout(関数、ミリ秒、param1、param2、...)

例えば。

function myFunction() {
  setTimeout(alertMsg, 3000, "Hello");
}

function alertMsg(message) {
    alert(message)
}

1
なぜこの答えが好ましいものではないのか誰かに教えてもらえますか?これは私の意見では最も簡単な方法です!単純なものsetTimeout( (p) => { console.log(p); }, 1000, "hi" );
Mazhar Zandsalimi '20 / 10/20

1
うん!これは受け入れられる答えになるはずです。MDNから:developer.mozilla.org/en-US/docs/Web/API/...
ハン


5

この質問が出されてから10年経っていることは知っていますが、それでもここまでスクロールした場合は、まだ問題が発生していると思います。Meder Omuralievによるソリューションは最も単純なものであり、私たちのほとんどを助けるかもしれませんが、拘束力を持たない人のために、ここにあります:

  1. setTimeoutにParamを使用する
setTimeout(function(p){
//p == param1
},3000,param1);
  1. すぐに呼び出される関数式を使用する(IIFE)
let param1 = 'demon';
setTimeout(function(p){
    // p == 'demon'
},2000,(function(){
    return param1;
})()
);
  1. 質問への解決策
function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    setTimeout(postinsql,4000,(function(){
        return xmlhttp.responseText;
    })());
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

4

私はそれが古いことを知っていますが、これに(推奨)フレーバーを追加したいと思いました。

これを実現するためのかなり読みやすい方法はtopicId、関数にを渡すことです。関数は、引数を使用してトピックIDを内部的に参照します。この値はtopicId、外部ですぐに変更されても変更されません。

var topicId = xmlhttp.responseText;
var fDelayed = function(tid) {
  return function() {
    postinsql(tid);
  };
}
setTimeout(fDelayed(topicId),4000);

または短い:

var topicId = xmlhttp.responseText;
setTimeout(function(tid) {
  return function() { postinsql(tid); };
}(topicId), 4000);

4

David Meisterの回答は、setTimeout()の呼び出し後、匿名関数が呼び出される前に変更される可能性のあるパラメーターを処理するようです。しかし、それは面倒であり、あまり明白ではありません。IIFE(即座に呼び出された関数式)を使用してほとんど同じことを行うエレガントな方法を発見しました。

以下の例でcurrentListは、遅延された関数が呼び出されるまで、変数がIIFEに渡され、IIFEがクロージャーに保存します。currentList表示されたコードの直後に変数が変更されてsetInterval()も、は正しいことを行います。

このIIFE手法がなければ、setTimeout()関数は間違いなくh2DOMの各要素に対して呼び出されますが、これらの呼び出しはすべて、最後の h2要素のテキスト値のみを参照します。

<script>
  // Wait for the document to load.
  $(document).ready(function() {
  $("h2").each(function (index) {

    currentList = $(this).text();

    (function (param1, param2) {
        setTimeout(function() {
            $("span").text(param1 + ' : ' + param2 );
        }, param1 * 1000);

    })(index, currentList);
  });
</script>

4

一般に、特定のパラメーターを使用してコールバックとして関数を渡す必要がある場合は、より高次の関数を使用できます。これはES6で非常にエレガントです。

const someFunction = (params) => () => {
  //do whatever
};

setTimeout(someFunction(params), 1000);

または、someFunction最初の注文の場合:

setTimeout(() => someFunction(params), 1000); 

これは非常に互換性がありません
user151496 2018年

確かにエレガント!ありがとう
Velojet

3

エラーメッセージでtopicIdが「未定義」であった理由は、setTimeoutの実行時にローカル変数として存在していたが、postinsqlへの遅延呼び出しが発生したときではないことに注意してください。特に「this」をオブジェクト参照として渡そうとする場合など、変数の有効期間は特に注意が必要です。

setTimeout関数に3番目のパラメーターとしてtopicIdを渡すことができると聞きました。詳細はあまりわかりませんが、機能させるために十分な情報が得られ、Safariで成功しました。「ミリ秒エラー」の意味がわかりません。ここでそれをチェックしてください:

http://www.howtocreate.co.uk/tutorials/javascript/timers


3

この段階をどのように解決しましたか?

そのように:

setTimeout((function(_deepFunction ,_deepData){
    var _deepResultFunction = function _deepResultFunction(){
          _deepFunction(_deepData);
    };
    return _deepResultFunction;
})(fromOuterFunction, fromOuterData ) , 1000  );

setTimeoutは関数への参照を待機するため、データを解釈し、データの適切なインスタンスを含む関数を返すクロージャーでそれを作成しました。

多分あなたはこの部分を改善することができます:

_deepFunction(_deepData);

// change to something like :
_deepFunction.apply(contextFromParams , args); 

私はそれをchrome、firefox、IEでテストしましたが、うまく動作します。パフォーマンスについてはわかりませんが、動作させるために必要でした。

サンプルテスト:

myDelay_function = function(fn , params , ctxt , _time){
setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.call(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// the function to be used :
myFunc = function(param){ console.log(param + this.name) }
// note that we call this.name

// a context object :
myObjet = {
    id : "myId" , 
    name : "myName"
}

// setting a parmeter
myParamter = "I am the outer parameter : ";

//and now let's make the call :
myDelay_function(myFunc , myParamter  , myObjet , 1000)

// this will produce this result on the console line :
// I am the outer parameter : myName

多分あなたはそれをより準拠させるために署名を変更することができます:

myNass_setTimeOut = function (fn , _time , params , ctxt ){
return setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.apply(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// and try again :
for(var i=0; i<10; i++){
   myNass_setTimeOut(console.log ,1000 , [i] , console)
}

そして最後に、元の質問に答えます:

 myNass_setTimeOut( postinsql, 4000, topicId );

それが役立つことを願っています!

PS:申し訳ありませんが、英語は私の母国語ではありません!


これは、他の回答に比べて非常に複雑です。
Dan Dascalescu、2015

3

これはすべてのブラウザで動作します(IEは変なボールです)

setTimeout( (function(x) {
return function() {
        postinsql(x);
    };
})(topicId) , 4000);

3

パラメータとして変数を渡したい場合はこれを試してみましょう

要件が関数であり、パルマとしての変数である場合は、これを試してください

setTimeout((param1,param2) => { 
     alert(param1 + param2);
     postinsql(topicId);
},2000,'msg1', 'msg2')

要件がパラメータとしての変数のみの場合は、これを試してください

setTimeout((param1,param2) => { alert(param1 + param2) },2000,'msg1', 'msg2')

ES5とES6でこれを試すことができます


2

'apply()'のデフォルト機能を次のように試すことができます。配列の要件として、より多くの引数を渡すことができます

function postinsql(topicId)
{
  //alert(topicId);
}
setTimeout(
       postinsql.apply(window,["mytopic"])
,500);

1

setTimeoutは、WHAT WGによって定義されたDOMの一部です。

https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html

希望する方法は次のとおりです。

handle = self.setTimeout( handler [, timeout [, arguments... ] ] )

タイムアウトミリ秒後にハンドラを実行するタイムアウトをスケジュールします。引数はすべて直接ハンドラーに渡されます。

setTimeout(postinsql, 4000, topicId);

どうやら、IE10では追加の引数がサポートされています。別の方法として、setTimeout(postinsql.bind(null, topicId), 4000);、追加の引数を渡す方が簡単なので、それが望ましい方法です。

歴史的なfactoid:VBScriptの時代、JScriptでは、setTimeoutの3番目のパラメーターは言語で、文字列として、デフォルトは「JScript」ですが、「VBScript」を使用するオプションがありました。https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa741500(v%3Dvs.85)


0

@Jiri Vetyskaの投稿に感謝しますが、例に問題があります。ホバリングしたターゲット(これ)をタイムアウトした関数に渡す必要があり、私はあなたのアプローチを試みました。IE9でテスト済み-機能しません。私もいくつかの調査を行いましたが、ここで指摘したように、3番目のパラメーターは使用されているスクリプト言語です。追加のパラメータについての言及はありません。

だから、私は@mederの答えに従って、このコードで私の問題を解決しました:

$('.targetItemClass').hover(ItemHoverIn, ItemHoverOut);

function ItemHoverIn() {
 //some code here
}

function ItemHoverOut() {
    var THIS = this;
    setTimeout(
        function () { ItemHoverOut_timeout(THIS); },
        100
    );
}
function ItemHoverOut_timeout(target) {
    //do something with target which is hovered out
}

これが他の誰かに役立つことを願っています。


0

IEの3番目のオプトナルパラメーターに問題があり、クロージャーを使用すると、変数(ループなど)を変更できず、望ましい結果が得られないため、次の解決策をお勧めします。

次のような再帰を使用してみます。

var i = 0;
var hellos = ["Hello World1!", "Hello World2!", "Hello World3!", "Hello World4!", "Hello World5!"];

if(hellos.length > 0) timeout();

function timeout() {                
    document.write('<p>' + hellos[i] + '<p>');
    i++;
    if (i < hellos.length)
        setTimeout(timeout, 500);
}

他に何もこれらの変数を変更しないこと、および無限再帰を回避するために適切な再帰条件を記述することを確認する必要があります。


0

//これらは3つの非常にシンプルで簡潔な回答です。

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

setTimeout(funny, 2000, 'hello', 'worldly', 'people');

0

質問に答えますが、2つの引数を持つ単純な加算関数を使用します。

var x = 3, y = 4;

setTimeout(function(arg1, arg2) { 
      delayedSum(arg1, arg2);
}(x, y), 1000);

function delayedSum(param1, param2) {
     alert(param1 + param2); // 7
}


-1

私はあなたが望むと思います:

setTimeout("postinsql(" + topicId + ")", 4000);

1
それが機能しない(常に「関数が定義されていません」というエラーが発生する)が、無名関数を使用しても機能する場合があります。上記の構文は常に機能するはずであると誰もが言うように思われるので、これはイライラします。(jQueryが何らかの形で「文字列としての引用」メソッドの邪魔になるのではないでしょうか?)
DA。

6
topicIdが関数であるとしましょう...またはオブジェクト。これは動作しません!
セラフェイム

この方法を続行する場合はJSON.stringify、通常のオブジェクトと配列に使用しJSON.parseてから、関数内で使用してください。ただし、オブジェクトにメソッドがある場合、すべての動作は失われます。
DarthCadeus

-2

//これらは3つの非常にシンプルで簡潔な回答です。

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

setTimeout(funny, 2000, 'hello', 'worldly', 'people');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.