2015年11月7日土曜日

JavaScriptまとめ3()

ただし、これは ECMAScript3 の仕様での話です。ECMAScript5 の仕様からグローバル変数 undefined についての記述を引用します。
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262%205th%20edition%20December%202009.pdf
15.1.1 Value Properties of the Global Object
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { Writable: false, Enumerable: false, Configurable: false }.
ECMAScript5 の仕様では undefined プロパティの Writable が flase となっていますので、値を変更することができなくなりました。






undefined はただのグローバル変数


こんなことだって可能
alert(undefined); // "undefined"
var undefined = "こんにちは";
alert(undefined) // "こんにちは"



自分の意思でundefinedを自由に書き換えることができる
つまり、undefinedは常にundefinedである保証はどこにもないから、undefinedを使うのを避けるべきとうことです。
対して、void演算子を使えば、常に本当のundefinedを返すので、安全です。


function test () {
    var undefined = true; //undefinedを上書き

    if(undefined){
        console.log( 'undefined: ' + undefined );
    }

    if(void 0 ){
        console.log( '決して実行されない' );
    }
}

test();


voidを使わずにundefinedを獲得する方法

(function(a,b,undefined){
    console.log(undefined)
})(1,2);

これはjQueryのソースでも使われている手法
無名関数をその場で実行し、実引数には1,2しか渡していないのに、仮引数のほうではa,b以外に、
もう一つundefinedという最初から渡されないと仮定した仮引数をセットすることで、安全にundefinedを獲得


○参考
 `undefined`の代わりに、`void 0`を使ったほうがいい
http://liginc.co.jp/web/js/38494