使用此关键字作为将参数传递给javascript中的函数的方法

时间:2018-01-27 18:23:09

标签: javascript

var now = 2018;

function calculateAge(yearOfBirth) {
    return now - yearOfBirth;
}

var Josh = {
    dateOfBirth: 1990,
    age: calculateAge(this.dateOfBirth),
}

console.log(Josh.age);

为什么我不能在函数中使用键作为参数?如果我把正常数字放在那里它工作正常但我不明白为什么那样做不行。它与递归或范围有关吗?

4 个答案:

答案 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