Javascript在函数赋值后未定义

时间:2015-09-06 13:56:30

标签: javascript this

所以我正在阅读适用于Web开发人员的Professional Javascript这本书,并且遇到了以下示例。

var object = {
  name: "my Object",
  getName: function() {
    return this.name;
  }
}

然后,作者显示以下结果:

object.getName(); // "my Object"
(object.getName)(); // "my Object"
(object.getName = object.getName)() // "undefined"

我理解第一个案例,但对案例2和案例3有以下问题。

案例2:在object.getName周围放置括号怎么办?到目前为止,我只知道你可以在匿名函数周围加括号来立即调用它(立即调用函数表达式)。但是如果函数不是匿名的呢?

案例3:为什么this在分配后没有得到维护?

1 个答案:

答案 0 :(得分:1)

此处的问题与this 更改无关。第三种情况的不同之处在于,用作函数引用的值已失去与上下文对象的关系。

当通过评估对象属性引用获得函数引用,然后调用该函数时,JavaScript会确保函数中的this设置为所涉及的对象。这就是前两种情况的工作方式。

在第三种情况下,函数引用最初是从对象获得的,但是

的总值
(object.getName = object.getName)

=分配的值。因此,与对象的关系被打破,而你所拥有的只是对函数的引用。因此,调用不会设置this。就像你写的那样:

var something = object.getName;
something();

这也不会将this设置为object。只有当函数引用直接来自.[ ]操作时,所涉及的对象才会在调用中以this结尾。案例2中的括号是一种特殊情况;在JavaScript中,括号不评估任何内容;它们会影响表达式的解析方式,但它们不会主动执行任何操作。