人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

javascriptを勉強しているのですが、関数の呼び出しでよくわからないことになっていますので、教えて下さい。

var obj = {
func : function() {
console.log('hello');
}
}

こう書いておいて、

obj.func();
(obj.func)();

と呼ぶと、期待通りに helloが2回表示されるのですが

(obj.func)();
obj.func();

順番を逆にすると、エラーになってしまいます。

TypeError: Cannot read property 'func' of undefined
at Object.<anonymous> (/Users/xxxxx/test.js:7:5)

エラー発生箇所は、最初の呼び出しです。
もうなんでエラーになるのか、わけかわからないです・・。どなたか解説して頂けますでしょうか?

環境はmacで、node.js 0.10.33 です。


●質問者: overwater
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
ベストアンサー
var obj = {
 func : function() {
 console.log('hello');
 }
}; // ※ここのセミコロンが大切!

(obj.func)();
obj.func();

var obj の変数宣言が明示的に終わっていないので、後続する (obj.func)() の評価で obj が宣言されていないことになってるっぽいです。

var obj = {
 func : function() {
 console.log('hello');
 }
}
a = 1; // 文としてはっきりしているものがあれば OK
(obj.func)();
obj.func();

でも、セミコロンが無くなると...

var obj = {
 func : function() {
 console.log('hello');
 }
}
a = 1 // セミコロンがなくなると、やっぱりエラーに
(obj.func)();
obj.func();

TypeError: 1 is not a function


2 ● Lhankor_Mhy

そういう時は明示的にセミコロンを入れないと文法エラーになります。

var a = {a:1}
(1) //error

var a = {a:1}
;(1)

Node.jsでもモジュールを書く時に頭にセミコロンを入れるおまじないをしたりしますでしょ?


Lhankor_Mhyさんのコメント
ああもう、また先を越された……

a-kuma3さんのコメント
(・ω<

overwaterさんのコメント
競争!? ありがとうございました!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ