本の面接試験問題はあなたとJSを更に近くさせます.
5794 ワード
これは面接の問題です.まず考えてください.説明を見ています.
説明は以下の通りです
1.main()、印刷の結果は:undefined、1
a. 最初の印刷の値を見てください.なぜundefinedですか?jsでは、メソッドと変数の宣言は前倒しされます.つまり、あなたがどこで声明しているかに関わらず、方法や変数は、js解析の際に、事前にコードを見ます.
b.>>もう一回見てみます.第二プリントの値はなぜ1ですか?コードをもう一回等価変換します.そうしたら、皆さんはもっと分かりやすくなるかもしれません.変換後のコードは下記の通りです.
2.var m=new main()、印刷の結果は:undefined、undefined
a.>>最初に印刷した値がundefinedである理由は上記の理由と同じであり、いずれも変数宣言の早期発生によるものである.
b.>>では、2番目の印刷の値もundefinedである理由は何ですか?Jsもオブジェクト指向プログラミング言語をサポートしていますが、jsにはクラスの概念がなく、プロトタイプベースの継承を使用しています.ですから、jsの中の構造関数も特別です.普通の場合は普通の方法とあまり変わりません.newのキーワードを通じて呼び出された時だけ構造関数としての機能が現れます.ここではmain()とnewキーワードを一緒に使っています.この時のmain()は構成関数です.構造関数のthisは新しく作成されたオブジェクトを指します.つまりmです.
var param = 1;
function main()
{
console.log(param);
var param = 2;
console.log(this.param);
this.param = 3;
}
// ?
main();
var m = new main();
説明は以下の通りです
1.main()、印刷の結果は:undefined、1
a. 最初の印刷の値を見てください.なぜundefinedですか?jsでは、メソッドと変数の宣言は前倒しされます.つまり、あなたがどこで声明しているかに関わらず、方法や変数は、js解析の際に、事前にコードを見ます.
demo(); // similar
function demo()
{
alert("similar");
}
jsの語句に従って順番を実行して、上から下へ順次実行するべきです.つまり先にデモを実行するということですが、この時もデモはまだ声明していません.存在しません.エラーを報告すべきです.なぜ正常にsimiarをイジェクトすることができますか?前に述べた方法については、js解析時には前倒しとなります.上のコードは解析してから、相当です.function demo()
{
alert("similar");
}
demo(); // similar
だから正常にsimiarを弾きます.変数に対する声明も同じです.上のコードは解析した後、実際には下のコードと同じです.var param; //
param = 1;
function main()
{
var param; //
console.log(param); // param , , undefined
param = 2;
console.log(this.param);
this.param = 3;
}
ここはあなたが疑問に思うかもしれません.私たちはメーンの外でもう1に値を付けたのではないですか? これは、私たちがメーンメソッドで同じ名前のparamを定義しているからです.近くの原則に従って、jsは先に自分がこの変数があるかどうかを調べることができて、もしあるならば、自分のを使って、もしないならば上級に調べて、上級はまだ上の方に行って探して、このように循環して、どこで探して、どこで停止します.全部なかったらundefinedに戻ります.【ここには知識点があります.jsの作用範囲チェーンと変数の検索は後でこの関連の解説文を書きます.】b.>>もう一回見てみます.第二プリントの値はなぜ1ですか?コードをもう一回等価変換します.そうしたら、皆さんはもっと分かりやすくなるかもしれません.変換後のコードは下記の通りです.
window.param = 1; // param
// main()
window.main = function () {
console.log(param);
var param = 2;
console.log(this.param); // this window, this.param = window.param = 1
this.param = 3;
}
// main()
window.main();
ここを見て、皆さんは分かりましたか?メーンメソッドとメーンメソッドの外のparamは一番外側の階に定義されていますので、彼らはすべてグローバルオブジェクトwindowの下のメンバーです.私たちがメーンメソッドを呼び出すと、実際に呼び出しのwindow.main(); このように呼びますと、thisは全体のオブジェクトwindowを指します.したがって、2番目の印刷の値は1です.【ここには知識点があります.jsの中のぼんやりしたthisは、後でこの関連の解説文を書きます.】2.var m=new main()、印刷の結果は:undefined、undefined
a.>>最初に印刷した値がundefinedである理由は上記の理由と同じであり、いずれも変数宣言の早期発生によるものである.
b.>>では、2番目の印刷の値もundefinedである理由は何ですか?Jsもオブジェクト指向プログラミング言語をサポートしていますが、jsにはクラスの概念がなく、プロトタイプベースの継承を使用しています.ですから、jsの中の構造関数も特別です.普通の場合は普通の方法とあまり変わりません.newのキーワードを通じて呼び出された時だけ構造関数としての機能が現れます.ここではmain()とnewキーワードを一緒に使っています.この時のmain()は構成関数です.構造関数のthisは新しく作成されたオブジェクトを指します.つまりmです.
var param = 1;
function main()
{
var param; //
console.log(param); // param , , undefined
param = 2;
console.log(this.param); // this , m , this.param = m.param , this.param , undefined ( : ? this.param ? )
this.param = 3;
}
var m = new main();
ここはあくまでもjsの中のthisについての理解の問題です.thisを把握していると、この問題はよく分かります.今はそれぞれの原因が分かりました.開豁な感じがありますか?ハハ…