質問: function() { console.log('わんわん'); }; } Dog(); console.dir(this); this.bark(); ``` このようにwindowのfunctionに記述してしまえば関数を呼び出したときに毎回関数を生成しなくても済むのではないかと思いました。しかし実際に生成されているかどうか判断する材料がない、もしくはわからないのでどなたかわかる方はいないでしょうか?
回答: そもそも下の考えたコードは欠陥品ですよ。 ``` function Dog() { console.dir("犬"); this.bark = function() { console.log('わんわん'); }; } function Fox() { console.dir("狐"); this.bark = function() { console.log('こんこん'); }; } Dog(); // 犬 Fox(); // 狐 this.bark(); // こんこん ``` わんわんどこいった という訳で、グローバルのthisに双方が書こうとした結果、上書きされて犬の鳴き声メソッドが死にました。 何故`dog`変数作って`dog.bark`にしようと思ったのかという意味を汲み取るようにしましょう。 > > しかし実際に生成されているかどうか判断する材料がない、もしくはわからないのでどなたかわかる方はいないでしょうか? > > > JavaScriptの関数・オブジェクト・配列は面白い特性があり、 比較演算子`===`で検証した場合、それが格納されているアドレス番地で比較して同じか否かを判定します。 ``` var o = {name: "taro"}; console.log(o === o); // true console.log(o === {name: "taro"}); // false var a = [123]; console.log(a === a); // true console.log(a === [123]); // false var fn = function () { return 123; }; console.log(fn === fn); // true console.log(fn === (function () { return 123; })); // false ``` このように全く同じように思えるものでも、 その場で`{}`や`[]`、`function(){}`で生み出したものは別のアドレス番地に一時的に作られてそのアドレス番地同士で比較するのでfalseになります。 この特性を使えば、「毎回生成されたのか否か」を確認することができます。 ``` function Dog (p) { this[p] = function () { console.log('わんわん'); } } Dog('taro'); Dog('jiro'); console.log(this.taro === this.jiro); // false ``` 違うものが生成されました。 従ってDogを二度実行して手に入れたこれらの関数は毎回生成されたと言えます。 つか、関数実行したら上から下まで実行するんだから生成してるに決まってるんですけどね。