Javascriptについて。

chrome extensionのソースを見ていたのですが

chrome.windows.getCurrent(function(wnd){
windowid = wnd.id
});

というような記述がありました。
どうも引数wndにはchrome.windows.getCurrent()の返り値(?)が入っているようなのですが、
wndに値が入ってくることが直観的によくわかりません。

どのような仕組みなのでしょうか

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/16 20:00:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.3

回答回数1422ベストアンサー獲得回数226

ポイント60pt

少しわかりにくいかもしれませんが、chrome.windows.getCurrent(fn) を実行するとChromeが fn に wnd を渡した状態で実行してくれるんです。


言い方を変えると chrome.windows.getCurrent は wnd をくださいというお願いをChromeにする関数です。

で、お願いの結果はgetCurrentの戻り値で返すのではなく、代わりにコールバック関数を渡しておくので wnd を渡して実行してください。となります。

Chrome拡張の関数はこのようにコールバック関数を渡す形で、関数自体は戻り値をくれないことがおおいです。


以下蛇足)

これは特別不思議な仕組みというわけでもなく、同じような関数は自分で作ることも出来ます。

例えばあまり良い例では無いですが、2倍した数字を返す関数は以下のように書くのが普通だと思いますが、

function bai(x) {
  return 2 * x;
}
alert(bai(2)); //ダイアログで4が表示される

コールバック形式で書こうと思えば以下のように書くことも出来ます。

function bai(fn) {
  fn(2 * x);
}
bai(alert); //ダイアログで4が表示される

コールバック形式のメリットは、例えば値を取得するのに時間がかかる場合に通常だとそこで街が発生してブラウザが固まってしまいますが、コールバック形式ならとりあえず値が欲しいというお願いだけをしてすぐブラウザに処理を戻すことができるのでブラウザが固まってしまうことが防げます、値の方は準備が出来た時点でコールバックに渡してくれるのでそこから処理を継続できます。このようにコールバック関数を渡す形には、並列実行が効率的に動作するのに向いた形と言えます。

コールバック形式をとっているAPIの代表格はAJAXリクエストです。もしAJAXのAPIがコールバック形式になっていなかったらAJAXの裏のリクエストを待っている間はブラウザが固まってしまって使い物にならない筈です。

id:dedara

ありがとうございます。

わかりやく大変参考になりました。

2011/10/16 19:59:09

その他の回答2件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント30pt

chrome.windows.getCurrentは引数に関数をとります。

参考:http://code.google.com/chrome/extensions/windows.html#method-getCurrent

この関数として、無名関数を渡しています。

参考:http://starry.night.nu/web/prog/javascript/c02_know_base_of_function.html#defining_anonymity_function

該当のコードを手続き型言語に慣れた人に分かりやすく書けば、細かいことを除けば、次のものと同等です。

function callbackFunc(wnd)
{
    windowid = wnd.id
}

chrome.windows.getCurrent(callbackFunc);

そこまで追っかけていませんが、chrome.windows.getCurrent関数の中が、ざっくりと次のような構造をしているはずです。

function getCurrent(func)
{
   var window = 現在のウィンドウオブジェクト;
   func(window);
}

何かの参考になれば。

id:dedara

ありがとうございます。

コールバック関数ということですね。

2011/10/16 20:03:09
id:Lhankor_Mhy No.2

回答回数814ベストアンサー獲得回数232

ポイント10pt

コールバック関数って奴ですね。

引数に関数オブジェクト(コールバック関数)を取って関数内でコールバック関数を呼び出すやり方です。

簡単な例を挙げると、こういうことです。

function returnTrue(callback){
  callback(true)
}

returnTrue(
  function(b){
    alert(b)
  }
)
id:dedara

ありがとうございます。

2011/10/16 20:07:28
id:y-kawaz No.3

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント60pt

少しわかりにくいかもしれませんが、chrome.windows.getCurrent(fn) を実行するとChromeが fn に wnd を渡した状態で実行してくれるんです。


言い方を変えると chrome.windows.getCurrent は wnd をくださいというお願いをChromeにする関数です。

で、お願いの結果はgetCurrentの戻り値で返すのではなく、代わりにコールバック関数を渡しておくので wnd を渡して実行してください。となります。

Chrome拡張の関数はこのようにコールバック関数を渡す形で、関数自体は戻り値をくれないことがおおいです。


以下蛇足)

これは特別不思議な仕組みというわけでもなく、同じような関数は自分で作ることも出来ます。

例えばあまり良い例では無いですが、2倍した数字を返す関数は以下のように書くのが普通だと思いますが、

function bai(x) {
  return 2 * x;
}
alert(bai(2)); //ダイアログで4が表示される

コールバック形式で書こうと思えば以下のように書くことも出来ます。

function bai(fn) {
  fn(2 * x);
}
bai(alert); //ダイアログで4が表示される

コールバック形式のメリットは、例えば値を取得するのに時間がかかる場合に通常だとそこで街が発生してブラウザが固まってしまいますが、コールバック形式ならとりあえず値が欲しいというお願いだけをしてすぐブラウザに処理を戻すことができるのでブラウザが固まってしまうことが防げます、値の方は準備が出来た時点でコールバックに渡してくれるのでそこから処理を継続できます。このようにコールバック関数を渡す形には、並列実行が効率的に動作するのに向いた形と言えます。

コールバック形式をとっているAPIの代表格はAJAXリクエストです。もしAJAXのAPIがコールバック形式になっていなかったらAJAXの裏のリクエストを待っている間はブラウザが固まってしまって使い物にならない筈です。

id:dedara

ありがとうございます。

わかりやく大変参考になりました。

2011/10/16 19:59:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません