JavaScript では、さまざまな方法で関数を定義できます。
function BatmanController () {
}
var BatmanController = function () {
}
// If you want to be EVIL
eval("function BatmanController () {}");
// If you are fancy
(function () {
function BatmanController () {
}
}());
偶然、今日、予期しない動作に出くわしました。function と同じ名前のローカル変数を (派手な方法で) 宣言すると、ローカル変数はローカル スコープ内に存在します。例えば:
(function () {
"use strict";
function BatmanController () {
}
console.log(typeof BatmanController); // outputs "function"
var RobinController = function () {
}
console.log(typeof RobinController); // outputs "function"
var JokerController = 1;
function JokerController () {
}
console.log(typeof JokerController); // outputs "number", Ehm what?
}());
var JokerController
によって上書きされない理由を知っている人はいますfunction JokerController
か? Chrome、Safari、Canary、Firefox でこれをテストしました。これは、V8 および JägerMonkey エンジンで行われた「先読み」JavaScript の最適化によるものだと思います。しかし、この動作を説明する技術的な説明はありますか?