Kanasan.JS JavaScript 第 5 版読書会 #3
2008-02-27


関数宣言の最後にセミコロンはいりません。これは入れ子になった関数宣言に対しても同じです。JavaScript にはセミコロンの自動補完があるので、本来セミコロンがいるのかどうか迷ってしまいますね。

function f() {
  function g() {
    ...
  }; // ← このセミコロンは不要 (この場合空文と解釈される)。
  ...
} // ← ここもセミコロンは不要。

関数式、関数リテラル、無名関数

個人的には、関数式と関数リテラルは構文の名前 (同一のものを関数式と呼ぶこともあれば関数リテラルと呼ぶこともある) で、無名関数とは識別子を指定していない関数式 (関数リテラル)、または Function コンストラクタによって作られる関数オブジェクトのことであると理解しています。(私も場合によっては意図的に混同させて使いますが。)

関数式 (関数リテラル) を使って名前つきの関数オブジェクトを作ることもできますが、JScript では関数式に指定した名前が外部に公開されたり、古い JavaScriptCore (Safari 2 以前) ではそもそも名前付き関数式に対応していなかったりするので、Web 上での使用は避けたほうがいいかもしれません。

var f = function g() { ... }; // 名前付き関数式
g(); // JScript ではエラーにならない。

負の無限大

Number.NEGATIVE_INFINITY-Infinity-1 / 0 はすべて同じ値 (負の無限大) を指します。

関数のオーバーロード

JavaScript では関数のオーバーロードはできないので、同様の機能を実現しようとしたら自分で引数をチェックとして処理を振り分ける必要があります。オーバーロードを実現するためのライブラリも多数公開されているようです (Introducing overload.jsJavaScript Method Overloading など)。

PascalCase

変数などの命名規則について。UpperCamelCase のことを PascalCase ともいうそうです。JavaScript 組み込みのメソッド名は基本的に lowerCamelCase なので、私はそれに合わせているのですが、アンダースコア区切りのほうがスコープが狭い気がするのでローカル変数はアンダースコア区切りという人もいました。

Function#length

関数オブジェクトの length プロパティ (仮引数の数を表す) は読み取り専用なので値を上書きできません。ただし、JavaScript では読み取り専用のプロパティに値を設定しようとしてもエラーは出ません。SpiderMonkey の strict モードでは警告が出ます。

function f(a, b, c) {}
f.length = 42;
// => strict warning: f.length is read-only
// => 42
// 代入式の返り値は右辺の値。
f.length;
// => 3

読み取り専用のプロパティを新しく作ることはできません。SpiderMonkey 1.7 (Firefox 2) までは Object.prototype.eval と const 文を組み合わせることにより実現可能でしたが、SpiderMonkey 1.8 (Firefox 3) で Object.prototype.eval は削除されます。

var o = {};
o.eval("const x = 42;");
o.x = 12;
o.x; // => 42 (o.x は読み取り専用になる)

カリー化と部分適用

個人的な理解では、一部の引数の値を固定するのが部分適用 (n 引数関数と m 個の値を受け取り、n - m 引数関数を返す)、ある関数を部分適用可能な関数に変換する操作がカリー化です。


戻る
[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット