var a ={}; a.abc = test; // aオブジェクトのプロパティabcに関数testを代入 a.abc(); //なぜ、testメソッドをこの行の上で定義してないのに // 動く? // ここで定義したメソッドを呼び出してるんじゃないの? // オブジェクトにくっついてる関数をメソッドと言う function test(){ alert("test") }
質問詳細
jsは上から読んでいってるので、
function test(){
alert("test")
}
でメソッド定義しても
定義したメソッドの上でメソッドを呼び出してるから
undifined method errorとかになりそうですが、
なぜか動きます。
その後a.abcにtestを代入しています。これは、当然aのプロパティabcです。testは関数であり、つまりオブジェクトでしたから、同じ関数がa.abcに代入されます
後このようにサイトには書いてあるのですが、
testが関数なら
a.abc = test();
と代入する方がなんだかしっくりくるのですが、
なぜそのように書かないのでしょうか?
ちなみにこのように書いても動きました。
なぜ動くのか教えていただければ幸いです。
よろしくお願いいたします。
参照
https://uhyohyo.net/javascript/1_4.html
メソッド
次に、メソッドというものを解説します。そんなに難しいものではなく、プロパティのうち、関数であるもののことをメソッドといいます。つまり、プロパティの一種です。
var a = {};
a.abc = test;
a.abc();
function test(){
alert("test");
}
やっていることは難しくありません。1行目でaに{}を代入していますが、これは「プロパティを1つも持たないオブジェクト」です。「プロパティ名 : 値」の組が1つもないわけですね。
そして、その後a.abcにtestを代入しています。これは、当然aのプロパティabcです。testは関数であり、つまりオブジェクトでしたから、同じ関数がa.abcに代入されます。つまり、a.abcを呼び出すのはtestを呼び出すのと同じです。(詳しい方は、厳密には少し違うということをご存知だと思いますが、それはここでは解説しません。)
なので、次の行ではそれを呼び出しています。ちゃんと"test"と表示されるのが分かります。
もともとメソッドの本当の意味はこんなところには無いのですが、それは今回は解説しません。オブジェクトにくっついてる関数をメソッドと呼ぶということは覚えておきましょう。
ちなみにこのように、関数定義は、使う場所より後ろに書いてあっても機能します。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/16 05:50
2021/07/16 05:53
2021/07/16 06:08