忍者ブログ

スイーツ(笑)と呼ばないで!!

NEW ENTRY
10 2024/11 1 23 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29 30 12

11/24/05:45  [PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

07/26/00:15  プログラム言語の異文化交流・・

先日、ちょっと頼まれて、html5のvideoタグを使って、mp4を再生しているソースを見ました。

html5を使うとAPIを使ってJavaScriptでいろいろと操作する機会も増えますよねー

今日はそんなJavaScriptについてのお話です。

テーマは「プログラム言語の異文化交流・・」と題して、
PHPバリバリ書いてるPGがJavaScriptを書くとうっかりやってしまうこと、
について書きたいと思います。

この世の中にはたくさんのプログラミング言語があり、
細かい違いはもちろんありますが、
条件分岐があったりループ処理があったりと、
すごーーーくざっくり言うと、似たようなもの、だったりしますね。

なので、PHPで一人前にプログラムを書けたりすると、
「ああ、JavaScriptではこう書くのね、了解ー」
という軽い感じでガリガリ書いてしまうというのもよく聞く話です。

でも、やっぱり言語にはそれぞれ固有の独自の仕様があったりするわけで、
そこを知らないと、それが理由でバグの温床になったりすることがあります。

JavaScriptの仕様で、意外と知られていないのがhoistingというやつです。
日本語だと「変数の巻き上げ」とか言ったりしますね。

以下、シンプルな例を用いて説明してみます。

var name=“yamada"; //グローバル変数nameを宣言し代入。

function printName(){
 console.log(name); //変数nameの中身をコンソールに出力。
}

printName(); //上で定義した関数printNameを実行。

このソースの実行結果は、yamadaと出力されます。
これはたぶんPHPプログラマの人もとても直感的に理解できると思います。

では、console.log(name);の下に1行だけ追加した以下のソースはどうなるでしょうか。

var name=“yamada"; //グローバル変数nameを宣言し代入。

function printName(){
 console.log(name); //変数nameの中身をコンソールに出力。
 var name=“tanaka”; //ローカル変数nameを宣言し代入。
}

printName(); //上で定義した関数printNameを実行。

普段PHP書いていて、JavaScriptも同じような感覚で書いているPGの方だと、もしかすると

「え? そのままグローバル変数のname読むから、結果はyamadaで変わらないでしょ?そもそも1行追加したの出力の下の行だし・・」

という回答をするかもしれません。

でも、JavaScriptでは、その期待は裏切られることになります。

実は、上記のJavaScriptは内部的にはhoisting(=変数の巻き上げ)により、

var name=“yamada"; //グローバル変数nameを宣言し代入。

function printName(){
 var name;
 console.log(name); //変数nameの中身をコンソールに出力。
 name=“tanaka”; //ローカル変数nameを宣言し代入。
}

printName(); //上で定義した関数printNameを実行。

と同じように解釈されます。

つまり、初期値の代入部分はそのままで、変数の宣言だけそのスコープ(この場合function)の先頭に巻き上がるんですねー

結果、上記ソースの出力は、初期化されていない変数の出力ということで「undefined」となります。

さて、JavaScriptにはこのようなhoisting(変数の巻き上げ)という仕様があるため、
そのスコープの途中で変数を宣言するのはバッド・プラクティスで、
そのスコープの最初でまとめて宣言するのがベスト・プラクティスと言われます。

つまり、functionの中であれば、functionの中のスコープで用いる変数はすべてそのスコープの頭で宣言すべきということですね。

言語によっては、変数の宣言はなるべく使うところの近くで行いましょう、という文化があるものもあります。

ただ、JavaScriptの場合は、そうではない、ということですね。

たまたま見たソースがスコープの途中で変数がたくさん宣言されていて、
「ああ、わかるわかる・・多くの人が通る道だな」
と思い、記事にしてみることにしました。

たくさんの言語があって、たくさんの文化があって、
なかなか深いところまで理解するのは大変です。

私も頑張らないとなーと思う今日このごろです^^;;;;




拍手[0回]

PR
URL
FONT COLOR
COMMENT
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
PASS

TRACKBACK

TRACKBACK-URL