1

http://mysite.com/#32132などのhasをJS経由でカスタム関数に渡そうとしています。

関数は次のとおりです。

var downloadVideo = function(passed){
  console.log(passed);
}

そして、これが私がURLからハッシュを取得して渡す方法です:

if(window.location.hash){
    var hash = window.location.hash;
    hash = hash.substring(1, hash.length); // Remove the # from the hash
    setTimeout('downloadVideo('+hash+')', 3000)
}

3秒後、コンソールにエラーが表示されます。

Uncaught ReferenceError:32132が定義されていません

downloadVideoを呼び出すさまざまな方法を試しました。引用符付き、引用符なし、プラス記号なし。何も機能していないようです。setTimeoutの直前にhashvarをconsole.logすると、正しく表示されます。

4

4 に答える 4

2

数字以外のものがある場合は、文字列として表す必要があります...

     // ------------------v--------v
setTimeout('downloadVideo("'+hash+'")', 3000);

しかし、終了する関数を渡す方が良いhashです...

setTimeout(function() { downloadVideo(hash) }, 3000);
于 2012-07-11T15:15:28.463 に答える
0

1)hasサブ文字列の2番目の引数は必要ありません-省略した場合、サブ文字列は文字列の末尾に一致します

2)タイムアウトがある場合は、無名関数を使用することをお勧めします。評価された文字列は、まあ、評価されます。一般的に悪い考えです。

3)引用符なしで文字列を渡しているため、エラーが発生しています。匿名関数を使用するようにポイント2を修正すると、このエラーがより目立つようになり、そもそもコミットするのが難しくなります

4)関数の呼び出しではなく、関数でいつでもタイムアウトを適用できます

ともかく:

setTimeout(function() { downloadVideo(hash); }, 3000);
于 2012-07-11T15:16:39.497 に答える
0

これを行うには、クロージャーを使用できます。

setTimeout(function() {
  downloadVideo(hash);
}, 3000);
于 2012-07-11T15:15:18.670 に答える
0

その場合、の値hashは次のようになりますtest

'downloadVideo('+hash+')'

...評価:

downloadVideo(test)

文字列は引用符で囲まれtestていないため、変数(存在しない)を参照しているように扱われることに注意してください。これは、文字列をに渡さない多くの理由の1つですsetTimeout。ここで説明されているように、これは悪い習慣です。

関数をに渡す方がはるかに優れていますsetTimeoutより安全で読みやすく、ここで見た問題に悩まされることはありません。引数が不要な場合は、関数を名前で参照してください。

setTimeout(downloadVideo, 3000)

あなたの場合のように引数が必要な場合は、無名関数への参照を渡し、その関数に呼び出したい関数を呼び出させる必要があります。

setTimeout(function() {
    downloadVideo(hash);
}, 3000)
于 2012-07-11T15:18:51.977 に答える