pirosikick's diary

君のハートにunshift

Javascript ちょっとしたtips

JavaScript Patterns

JavaScript Patterns

今、↑この本を読んでいます。半分くらい読んだので前半の「ふーん」と思ったことをまとめます。

繰り返しはカウントアップよりカウントダウンの方がスマートに書ける

var ary = ["a", "b", "c"],
    len = ary.lenght;

for (var i = 0; i < len; i++) {
    // some code
}

上記サンプルはカウントアップ。下記はカウントダウン。

var ary = ["a", "b", "c"];

for (var i = ary.len; i--;) {
    // some code
}

while文で同じことやる場合は↓

var ary = ["a", "b", "c"],
    i = ary.length;

while (i--) {
    // some code
}

functionの中のthisについて

function Sample() {
    this.name = "what is this?";
}

↑Sampleを「Sample()」のように実行する場合と、newを使ってオブジェクト生成するときに実行される場合とではthisが指しているものが違う。

new Sample()

まずnewを使った時に実行されるとき。

var a = new Sample();

console.log(a.name) // "sample!" → this = a

thisはaを指している。

Sample()

Sample()の場合。

Sample();

console.log(name);

thisはwindowを指している。つまり、nameはグローバル変数になる!

【解決策】thatを使う
function Sample() {
    var that = {};
    that.name = "aaa";
    return that;
}

newをつけ忘れた場合でも同じ結果が得られる。

var first = new Sample(),
    second = Sample();

console.log(first.name);  // 'aaa'
console.log(second.name); // 'aaa'

Functionの中でFunctionを再定義

「最初の1回だけ別の動作をしたい」というときには、下記のようにfunctionの中でfunctionを再定義する。

function Sample() {
    console.log("first time");

    Sample = function () {
        console.log("not first time");
    }
}

console.log(Sample()); // first time
console.log(Sample()); // not first time

オブジェクトの定義

「undefined」の時だけ新しくオブジェクトを作りたい場合は下記のようにする。

var obj = obj || {};

意外と多くなりそうなので今回はこのへんでー