在这个W3Schools example中,我没有了解changeName
的工作方式:
function person(firstname, lastname, age, eyecolor) {
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
this.eyecolor = eyecolor;
this.changeName = changeName;
function changeName(name) {
this.lastname = name;
}
}
myMother = new person("Sally", "Rally", 48, "green");
myMother.changeName("Doe");
document.write(myMother.lastname);
为什么我们有this.changeName=changeName
,然后是changeName
的函数定义?
答案 0 :(得分:4)
它正在为changeName
对象定义一个方法person
- 但是以某种方式,相同(更好)的方法是:
this.changeName = function(name) {
this.lastname = name;
}
(因此'请不要使用w3school')
答案 1 :(得分:1)
这是你的代码(来自您的参考):
<!DOCTYPE html>
<html>
<body>
<script>
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}
myMother=new person("Sally","Rally",48,"green");
myMother.changeName("Doe");
document.write(myMother.lastname);
</script>
</body>
</html>
键入此代码时:
function changeName(name)
{
this.lastname=name;
}
你基本上是在发挥作用。
当你这样做时:
this.changeName=changeName;
你基本上是说“函数changeName(在RHS上)属于这个函数,即person。(但是,人被用作对象)”
因此,当您看到链接提供的代码时,全局代码会定义一个对象 myMother ,并且只是因为您说changeName
而访问myMother.changeName()
this.changeName = changeName
1}}
答案 2 :(得分:1)
This.changeName是一个属性。
this.changeName = changeName只是函数的声明。
//Here you create your Person Object
myMother=new person("Sally","Rally",48,"green");
//Here you affect the LastName "Doe" By calling the ChangeName function of the object Person
myMother.changeName("Doe");
答案 3 :(得分:1)
在JavaScript中使用此代码:
function foo() {
function changeName() {
}
this.changeName = changeName;
}
与
相同function foo() {
this.changeName = changeName;
function changeName() {
}
}
这是因为在javascript中提升所有声明都是由翻译开始的。
答案 4 :(得分:1)
以下是一些可能问题的其他答案:
JavaScript只有两个范围:
全球范围
功能范围
JavaScript中有无阻止范围!
由于变量提升,所有在范围内声明的变量都可用,因为它们都是在该范围的开头声明的。
这就是为什么建议在其范围的开头声明所有变量,以更好地反映现实,可能在单个var声明中。
e.g。
function person(firstname, lastname, age, eyecolor) {
var changeName = function (name) {
this.lastname = name;
}
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
this.eyecolor = eyecolor;
this.changeName = changeName;
}
实际上,在这种情况下,根本不需要变量或命名函数。
只需直接为对象属性分配一个匿名函数:
function person(firstname, lastname, age, eyecolor) {
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
this.eyecolor = eyecolor;
this.changeName = function (name) {
this.lastname = name;
}
}
JSLint或JSHint等工具可以帮助您改进JavaScript代码。
请参阅this sample @ codepen.io(在JS编辑器中按CTRL + SHIFT + 7)和JSHint use at codepen.io。
最后,Mozilla开发者网络是比W3Schools更好的资源。
它甚至会教你document.write Notes这不是一个好习惯。