1

だから私は全体として「適切な」Javascriptプログラミングに不慣れです。私はこれまで、jQuery に少し手を加えた単純な DOM 操作にしか実際に使用したことがありません。現在、OOP などを含む Javascript でのプログラミングの完全な概念を学ぼうとしています。私はJSのスコープについてかなり理解していると思っていましたが、これは理解できません:

function Person(name, age){
    this.name = name;
    this.age = age;

    this.getName = function(){
        return name;
    }

    this.setName = function(name){
        this.name = name;
    }

    this.getAge = function(){
        return age;
    }

    this.setAge = function(age){
        this.age = age;
    }
}

p = new Person("Bob", 12);
console.log(p.getName());
console.log(p.getAge());

console.log(name);  //logs "an empty string" - What?
console.log(age);   //logs "ReferenceError: age is not defined" - Expected

最初の 2 つの s がうまくいった後、関数内のプロパティの値をチェックして、スコープから外れたものがないことを確認console.logしたいと思いました。ある程度は持っていましたが(空の値を与えただけでしたが、まだ存在していました)、年齢はそうではありませんでした。Personname

タイプミスは見当たりません。これが、この問題の原因であると私が理解できた唯一のことです。では、なぜconsole.log(name);を与えないのReferenceErrorでしょうか?

答えを知りたいだけですが、プロトタイプ、レキシカルスコープ、巻き上げなどの重要な用語を含め、根本的な問題の完全な説明をいただければ幸いです。

4

2 に答える 2

2

識別子はブラウザのnameグローバル スコープに存在し、window.

を参照してくださいwindow.name

于 2013-12-12T08:51:55.350 に答える
1

プロトタイプをまったく使用していないため、コンストラクターのプロトタイプに関数を配置することをお勧めします。コンストラクター関数とプロトタイプの詳細については、この回答をご覧ください。

年齢が記録されない理由について。これは、p.age ではなく window.age をログに記録しようとしているためです。

p = new Person("Bob", 12);
console.log(p.name);
console.log(p.age);
console.log("this is:",this);
console.log("does window have a name property?",typeof this.name);
console.log("does window have an age property?",typeof this.age);
于 2013-12-12T09:03:43.633 に答える