1

所以我对“正确”的 Javascript 编程作为一个整体是新手。我只真正将它用于简单的 DOM 操作,并稍微涉足 jQuery。现在我正在尝试学习 Javascript 编程的完整概念,包括 OOP 等。我喜欢认为我对 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

在前两个console.logs 出来之后,我想检查Person函数中属性的值,以确保没有任何内容超出范围。name必须在某种程度上(只给出了一个空值 - 但仍然存在),但年龄没有。

我看不到任何拼写错误,这是我唯一能理解的导致此问题的原因。那么为什么不console.log(name);给aReferenceError呢?

尽管我很想知道答案,但我非常感谢对根本问题的完整解释,包括任何关键术语,如原型、词汇范围、提升等。

4

2 回答 2

2

name标识符存在于浏览器的全局范围内,它是window.

window.name

于 2013-12-12T08:51:55.350 回答
1

您根本没有使用原型,最好将函数放在构造函数原型上。有关构造函数和原型的更多信息,您可以查看此答案

至于为什么不记录年龄;这是因为您尝试记录 window.age 而不是 p.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 回答