chrome extensionのソースを見ていたのですが
chrome.windows.getCurrent(function(wnd){
windowid = wnd.id
});
というような記述がありました。
どうも引数wndにはchrome.windows.getCurrent()の返り値(?)が入っているようなのですが、
wndに値が入ってくることが直観的によくわかりません。
どのような仕組みなのでしょうか
少しわかりにくいかもしれませんが、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の裏のリクエストを待っている間はブラウザが固まってしまって使い物にならない筈です。
chrome.windows.getCurrentは引数に関数をとります。
参考:http://code.google.com/chrome/extensions/windows.html#method-getCurrent
この関数として、無名関数を渡しています。
該当のコードを手続き型言語に慣れた人に分かりやすく書けば、細かいことを除けば、次のものと同等です。
function callbackFunc(wnd) { windowid = wnd.id } chrome.windows.getCurrent(callbackFunc);
そこまで追っかけていませんが、chrome.windows.getCurrent関数の中が、ざっくりと次のような構造をしているはずです。
function getCurrent(func) { var window = 現在のウィンドウオブジェクト; func(window); }
何かの参考になれば。
ありがとうございます。
コールバック関数ということですね。
コールバック関数って奴ですね。
引数に関数オブジェクト(コールバック関数)を取って関数内でコールバック関数を呼び出すやり方です。
簡単な例を挙げると、こういうことです。
function returnTrue(callback){ callback(true) } returnTrue( function(b){ alert(b) } )
ありがとうございます。
少しわかりにくいかもしれませんが、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の裏のリクエストを待っている間はブラウザが固まってしまって使い物にならない筈です。
ありがとうございます。
わかりやく大変参考になりました。
ありがとうございます。
わかりやく大変参考になりました。