Edit
JavaScriptの基本

JavaScriptは変数に型がないため、バグが発生しやすい。そこでプログラムを作る時には注意が必要である。

Edit
import , export

ES6(ECMAScripts2015)からは、import export を使ったモジュール機能が提供されている。ブラウザでも利用できるので、こちらを参照。

Edit
文法

Edit
関数の定義

JavaScriptは、変数も関数も皆オブジェクトとして代入や呼び出しができる非常に自由度の高い設計になっているため以下の様な無名関数という概念がある。

function hello(){
     alert("こんにちわ");
}
hello();

この記述は、関数helloを定義して、その後実行という流れになる。しかしhelloを関数でなく、変数に代入することで関数として呼び出す事もできる。

var hello = function(){
                            alert("こんにちわ");
                  };
hello();

これは処理の結果として同じになる。そもそもJavaScriptでは、変数に型が無いため自由に変数にものが入れられる上に、関数すら変数に入れられるという言語仕様になっている。ちなみに、この後者の関数名を作らず関数を定義することを無名関数という。当然名無しの関数そのものでは、使えないのでどこかの変数に入れて使うというわけだ。

処理的に関数を定義せず、そこで直ぐに実行する場合などは、その場に展開すれば実行されるが、名前空間を汚したくない場合などには、よく下記のようなコードにすることで、名前空間を汚さない処理を実現できる。

( function(){ alert("こんにちわ"); } )();

他の言語においては、ブロック内({}この大括弧でくくられた中)の変数名などは、そのブロック内でのみがスコープ範囲となるが、JavaScriptでは、ブロック文にそのような機能がなく、土台のオブジェクトにどんどん登録されてしまう。しかし、例外として関数内は独立した空間となるために、このような無名関数の即実行形式にすることで、名前空間を汚さず(勝手に登録させず)自由に変数名などを作ることができるようになる。これは、よくJavaScriptのライブラリを作る際に利用されている方法である。

Edit
良く利用される関数

もどり値関数名概要
voidsetInterval( 関数名, 呼び出し周期 );呼び出し周期毎に、引数1の関数名が呼び出される。例:setInterval(update, 1000/60);

Edit
JavaScriptsのライブラリ

Edit
MessagePack

Edit
MessagePack-Lite

使い方(ブラウザ)

<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>

Edit
関数リファレンス

JavaScriptに関するW3Cの公式ページ
CSS(Cascading Style Sheets)とはなんだろう?

Edit
getElementsByシリーズ

このgetElementsBy〜の関数だけをまとめたサイト

Edit
テクニック

Edit
lengthプロパティ

for文などで、ループさせるとき条件分によく使う、lengthプロパティは、一度、var に代入してから使った方が、処理が高速になる。(わずかだが)これは、lengthプロパティの参照にオブジェクト参照のオーバーヘッドがかかっている為である。
良くある例

if( var i=0 ; i<array.length ; i++ ){

高速化

var max = array.length;
if( var i=0 ; i<max ; i++ ){

Edit
socket.ioについて

Edit
認証

Edit
WebSocket

バイナリタイプの指定

connection.binaryType = 'arraybuffer';

Edit
勉強のページ

Edit
JavaScript用のエディタ

Edit
便利なライブラリの紹介

Edit
リンク

Edit
V8エンジンの組み込み

Edit
gypのインストール

# git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

取得した depot_toolsにパスを通す。

# export PATH=`pwd`/depot_tools:"$PATH"

Edit
glic-develのインストール

# yum install glibc-devel.i686      <- CentOS 5.8だと、i686の代わりにi386
# yum install libstdc++-devel.i686

Edit
V8エンジンのソース取得

<すべて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

Edit
コンパイル

<すべてコンパイル>

# make

<特定のものだけコンパイル>

# make arm.release

armの部分は、「arm」「arm64」「ia32」「x86」「mips」などのCPUアーキテクチャーが入る。 releaseの部分には、「release」「debug」「optdebug」が設定できる。

※注意:v8は、C++11 で書かれているため、コンパイルオプションに「-std=c++11」が必須です。

Edit
Linux(centos7)上でのサンプル実行

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! と表示されれば成功。