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 です。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2015/04/10 08:52:28
  • 終了:2015/04/11 05:15:57

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032015/04/10 10:10:45

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

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032015/04/10 10:10:45ここでベストアンサー

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

id:Lhankor_Mhy No.2

Lhankor_Mhy回答回数779ベストアンサー獲得回数2302015/04/10 10:51:21

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

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

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

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

他1件のコメントを見る
id:a-kuma3

(・ω<

2015/04/10 11:04:24
id:overwater

競争!?

ありがとうございました!

2015/04/11 05:16:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません