人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javascriptについて。
chrome extensionのソースを見ていたのですが

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

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

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

●質問者: dedara
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tdoi
●30ポイント

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);
}

何かの参考になれば。

◎質問者からの返答

ありがとうございます。

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


2 ● Lhankor_Mhy
●10ポイント

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

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

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

function returnTrue(callback){
 callback(true)
}

returnTrue(
 function(b){
 alert(b)
 }
)
◎質問者からの返答

ありがとうございます。


3 ● y-kawaz
●60ポイント ベストアンサー

少しわかりにくいかもしれませんが、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の裏のリクエストを待っている間はブラウザが固まってしまって使い物にならない筈です。

◎質問者からの返答

ありがとうございます。

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ