所以我是'适当的'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.log
出现之后,我想检查Person
函数中属性的值,以确保没有任何内容超出范围。 name
在一定程度上(只给出了一个空值 - 但仍然存在),但年龄却没有。
我看不到任何拼写错误,这是我唯一能理解的问题。那么为什么console.log(name);
没有给出ReferenceError
?
尽管我想知道答案,但我真的很感激对根本问题的完整解释,包括任何关键术语,如原型,词法范围,吊装等。
答案 0 :(得分:2)
name
标识符存在于浏览器的全局范围内,它是window
的属性。
请参阅window.name
。
答案 1 :(得分:1)
你根本不使用原型,最好将函数放在构造函数原型上。有关构造函数和原型的更多信息,您可以查看this answer。
至于为什么不记录年龄;这是因为你试图记录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);