JavaScriptは変数に型がないため、バグが発生しやすい。そこでプログラムを作る時には注意が必要である。
ES6(ECMAScripts2015)からは、import export を使ったモジュール機能が提供されている。ブラウザでも利用できるので、こちらを参照。
JavaScriptは、変数も関数も皆オブジェクトとして代入や呼び出しができる非常に自由度の高い設計になっているため以下の様な無名関数という概念がある。
function hello(){ alert("こんにちわ"); } hello();
この記述は、関数helloを定義して、その後実行という流れになる。しかしhelloを関数でなく、変数に代入することで関数として呼び出す事もできる。
var hello = function(){ alert("こんにちわ"); }; hello();
これは処理の結果として同じになる。そもそもJavaScriptでは、変数に型が無いため自由に変数にものが入れられる上に、関数すら変数に入れられるという言語仕様になっている。ちなみに、この後者の関数名を作らず関数を定義することを無名関数という。当然名無しの関数そのものでは、使えないのでどこかの変数に入れて使うというわけだ。
処理的に関数を定義せず、そこで直ぐに実行する場合などは、その場に展開すれば実行されるが、名前空間を汚したくない場合などには、よく下記のようなコードにすることで、名前空間を汚さない処理を実現できる。
( function(){ alert("こんにちわ"); } )();
他の言語においては、ブロック内({}この大括弧でくくられた中)の変数名などは、そのブロック内でのみがスコープ範囲となるが、JavaScriptでは、ブロック文にそのような機能がなく、土台のオブジェクトにどんどん登録されてしまう。しかし、例外として関数内は独立した空間となるために、このような無名関数の即実行形式にすることで、名前空間を汚さず(勝手に登録させず)自由に変数名などを作ることができるようになる。これは、よくJavaScriptのライブラリを作る際に利用されている方法である。
もどり値 | 関数名 | 概要 |
void | setInterval( 関数名, 呼び出し周期 ); | 呼び出し周期毎に、引数1の関数名が呼び出される。例:setInterval(update, 1000/60); |
使い方(ブラウザ)
<head> <script src="https://rawgit.com/kawanet/msgpack-lite/master/dist/msgpack.min.js"></script> <script> function disp() { var msgpack = require("msgpack-lite"); var buffer = msgpack.encode({"foo": "bar"}); var data = msgpack.decode(buffer); var div_element = document.createElement("div"); div_element.innerHTML = JSON.stringify(data); var parent_object = document.getElementById("area"); parent_object.appendChild(div_element); } </script> <body> <button onclick="disp();">Push</button> <div id="area"></div> </body>
JavaScriptに関するW3Cの公式ページ
CSS(Cascading Style Sheets)とはなんだろう?
for文などで、ループさせるとき条件分によく使う、lengthプロパティは、一度、var に代入してから使った方が、処理が高速になる。(わずかだが)これは、lengthプロパティの参照にオブジェクト参照のオーバーヘッドがかかっている為である。
良くある例
if( var i=0 ; i<array.length ; i++ ){
高速化
var max = array.length; if( var i=0 ; i<max ; i++ ){
バイナリタイプの指定
connection.binaryType = 'arraybuffer';
# git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
取得した depot_toolsにパスを通す。
# export PATH=`pwd`/depot_tools:"$PATH"
# yum install glibc-devel.i686 <- CentOS 5.8だと、i686の代わりにi386 # yum install libstdc++-devel.i686
<すべてdepot_toolに任せる方法>
# fetch v8 <- 自動取得
<ソースを取得して自分で環境準備>
# git clone git://chromium.googlesource.com/v8/v8.git # vi .gclient solutions = [ { "managed": False, "name": "v8", "url": "https://chromium.googlesource.com/v8/v8.git", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", }, ] # gclient sync
<すべてコンパイル>
# make
<特定のものだけコンパイル>
# make arm.release
armの部分は、「arm」「arm64」「ia32」「x86」「mips」などのCPUアーキテクチャーが入る。 releaseの部分には、「release」「debug」「optdebug」が設定できる。
※注意:v8は、C++11 で書かれているため、コンパイルオプションに「-std=c++11」が必須です。
v8のプロジェクトフォルダに、googleのサンプルコードを、hello_world.cpp として保存し、以下のコマンドを実行
# vi compile.sh g++ -I. hello_world.cpp -o hello_world \ -Wl,--start-group out/x64.release/obj.target/{tools/gyp/libv8_{base,libbase,snapshot,libplatform},third_party/icu/libicu{uc,i18n,data}}.a \ -Wl,--end-group \ -lrt -pthread -std=c++11 -lm -ldl # chmod +x compile.sh # ./compile.sh
<実行>
# ./hello_world
画面に、Hello, World! と表示されれば成功。