- 共通テーマ:
- JavaScript テーマに参加中!
本題に入る前に、
普通に関数を作って実行するとき
var foo = function() {
…
};
foo();
としますよね。
この動作を普通に説明すると、
- 無名関数をfooに代入
- fooを実行
という感じになりますが、もう少し細かく分解して、
function(){}はその関数の参照を値に持つ
JavaScriptでは、functionの代入は参照を渡すので、
var foo = function() {
…
};
- は左辺のfunction(){}は、自身への参照値を持ち、
- それをfooに代入
していることがわかります。
関数の参照にカッコ()を付けると、関数を実行する
次に、普段なんとなく使っている
foo();
これは
- foo(参照)に演算子()を付けると、関数が実行される
…という事をあらわしていますね。
ということで、fooもカッコを付けないと参照だし、function(){}の値も参照です。
だったら、
foo();
のfooのところをfunction(){}に置き換えても動くんじゃないか…という事で、
function(){}にカッコ()を直接付けてみる
function(){
…
}();
エラーが出ました><
どうやらfunctionが行頭にあると、式(値を持つ)ではなく、文(値を持たない命令)として解釈され、
参照値を持たないものに演算子()を付けたためエラーが出たようです。
参考:IT戦記:(function(){})() と function(){}()
function(){}をカッコで囲めば式として解釈され、晴れて関数への参照値を持つことができます。
ということで、
function(){}をカッコで囲んで
(function() {
…
})();
出来上がり!
以上を踏まえて、更に
引数を渡す
(function(foo) {
alert(foo) // 「bar」と表示
})('bar');
戻り値を受け取る
var foo = function() {
return 'bar';
}();
alert(foo); // 「bar」と表示
↑はfunctionが行頭にないので、function(){}をカッコで囲む必要がない
無名オブジェクトの場合は?
法則はだいたい同じ。
無名オブジェクから、メソッドを即実行
↓構文エラー
{ foo: function(){ alert('bar'); } }.foo();
↓カッコ()を付ければ動く
({ foo: function(){ alert('bar'); } }).foo(); // barと表示
↓はカッコ()がいらない。
var baz = { foo: function(){ return 'bar'; } }.foo();
alert(baz); // barと表示
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/1d294f9f35fb3d4e1d1a078db21d5a80aac607cc/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/e/0/e0cb906b.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/b40a6b5b93f1928050656d824569f90fdd7b0eda/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/4/f/4f5406de.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/70699955a995b3dbf3a46b793a0a3adf0682b5e2/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/1/a/1af167ad.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/b5c86b6fd58a4ee8b61847c0929d94146d0ed276/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/0/2/02fa5750.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/5c4cbbba9a2845b5f61f99348f6787bbbedda0e5/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/8/e/8e11782c.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/ba9763251daa36d3177f5997aecdb165139573cf/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/e/9/e93e7fd2.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/921a0042fb2e83875498946c682e3b3c271afcfd/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/b/d/bd37cf4a.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/4f485d7baaf470cea4944b70bfa1ba489c3dfcd2/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/b/b/bbc9870a.gif)
![Eclipse + ChromeでJavaScriptデバッグ [Google Chrome Developer Toolsインストール編]](http://resize.blogsys.jp/0f558c82896edffb67b614d0e97b4564315911e1/crop1/50x50_ffffff/http://livedoor.blogimg.jp/eeu/imgs/1/4/14a1b359.gif)
どうでもいいコメントですが、よろしいでしょうか。
こちらのブログがカテゴリアーカイブのページだけ新共通ヘッダーが表示されない理由ですが、阿闍梨だったら、たぶん、もうご存知かと思います。
そう、奴は、<body>に反応するのです(笑)
bodyタグを独自タグの条件式で括るとヘッダー周りのソースが書き出されずこうなるようです。ちょっとしたバグでしょうか。ていうかこちらの場合そもそもナレッジの過去の私の回答(タグ別ページでスタイルというかclass名を変える方法)が原因なのですがw
ということは逆に、この新共通ヘッダーというものは、無料版でも驚くほど簡単に消せてしまう、ということになってしまいますよね。bodyを挟む条件式をIfPreviewmodeとかにすればすべてのページで適用できるわけだし。
中の人に教えてあげたほうがいいでしょうか。
fixdapに裏技と称して思いっきり書き込んじゃおうかな。
他の多数の要望と共に、中の人に見てもらいたい一心で