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回まで
  • 登録:
  • 終了:2015/04/11 05:15:57

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

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

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

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

回答回数814ベストアンサー獲得回数232

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

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

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

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

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

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

回答リクエストを送信したユーザーはいません