Javascriptについて。

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

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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/14 16:06:42
  • 終了:2011/10/16 20:00:14

ベストアンサー

id:y-kawaz No.3

y-kawaz回答回数1419ベストアンサー獲得回数2252011/10/14 16:47:58

ポイント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

tdoi回答回数174ベストアンサー獲得回数752011/10/14 16:35:08

ポイント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

Lhankor_Mhy回答回数775ベストアンサー獲得回数2302011/10/14 16:37:21

ポイント10pt

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

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

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

function returnTrue(callback){
  callback(true)
}

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

ありがとうございます。

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

y-kawaz回答回数1419ベストアンサー獲得回数2252011/10/14 16:47:58ここでベストアンサー

ポイント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

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません