var now = 2018;
function calculateAge(yearOfBirth) {
return now - yearOfBirth;
}
var Josh = {
dateOfBirth: 1990,
age: calculateAge(this.dateOfBirth),
}
console.log(Josh.age);
为什么我不能在函数中使用键作为参数?如果我把正常数字放在那里它工作正常但我不明白为什么那样做不行。它与递归或范围有关吗?
答案 0 :(得分:2)
原因是在本声明中:
var Josh = {
dateOfBirth: 1990,
age: calculateAge(this.dateOfBirth),
}
this
不会引用Josh
,也不引用将成为Josh
的对象。它是不可能的,因为当这个语句执行时,这些东西都不存在。
在此声明中,this
指的是该范围内任何其他声明中引用的内容。
console.log(this); // <-- same this
var Josh = {
dateOfBirth: 1990,
age: calculateAge(this.dateOfBirth), // <-- same this
}
console.log(this.someProperty); // <-- same this
如果该范围中的this
没有dateOfBirth
属性1990
,那么您将无法获得您期望的结果。
如果您想避免重复1990
值,请将其存储在变量中,并引用该变量:
var dob = 1990;
var Josh = {
dateOfBirth: dob,
age: calculateAge(dob)
};
答案 1 :(得分:1)
除了其他好的答案之外,您还可以通过简单地为年龄属性设置 getter 来实现您正在寻找的行为:
function calculateAge(yearOfBirth) {
return 2018 - yearOfBirth;
}
var Josh = {
dateOfBirth: 1990,
get age() {
return calculateAge(this.dateOfBirth);
}
}
Josh.age; // > 28
此方法的另一个好处是Josh.age
在访问时实时计算,因此它将始终与Josh.dateOfBirth
同步:
Josh.age; // > 28
Josh.dateOfBirth = 1988;
Josh.age; // > 30
答案 2 :(得分:0)
例如: 想象一下,这是您的Javascript文件中唯一的代码行
// In web browsers, the window object is also the global object:
console.log(this === window); // true
上面的示例显示了this
的行为方式,this
依赖于其上下文的值。
在您的代码中使用this
并未引用您的对象Josh
,它引用了当前被调用的函数或全局上下文。
如果您尝试按照this
打印console.log(this)
,您会发现this
的值与Josh
不同。
this
上下文的Josh
:var Josh = function() { this.dateOfBirth = 1990, this.age = calculateAge(this.dateOfBirth) };
查看此代码段:
var now = 2018;
function calculateAge(yearOfBirth) {
return now - yearOfBirth;
}
var Josh = function() {
this.dateOfBirth = 1990,
this.age = calculateAge(this.dateOfBirth)
};
console.log(new Josh().age);
请注意,现在它将正确的值传递给您的函数calculateAge
。
答案 3 :(得分:-2)
试一试,
ab initio
ab intestato
ab intra
a.C.
acanka, acance, acanek, acankach, acankami, acanką
Achab, Achaba, Achabem, Achabie, Achabowi