Javascript函数赋值后,此函数未定义

Javascript函数赋值后,此函数未定义,javascript,this,Javascript,This,因此,我在阅读《面向Web开发人员的专业Javascript》一书时,遇到了以下示例 var object = { name: "my Object", getName: function() { return this.name; } } 然后,作者展示了以下结果: object.getName(); // "my Object" (object.getName)(); // "my Object" (object.getName = object.getName)()

因此,我在阅读《面向Web开发人员的专业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:
为什么分配后不维护此

这里的问题实际上与
这一变化没有任何关系。第三种情况的不同之处在于,用作函数引用的值已失去与上下文对象的关系

当通过评估对象属性引用获得函数引用,然后调用该函数时,JavaScript确保将函数中的
设置为所涉及的对象。这就是前两个案例的工作原理

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

(object.getName = object.getName)
是该
=
赋值的值。因此,与对象的关系被破坏,而您所得到的只是对函数的引用。因此,调用不会设置此
。就好像你写过:

var something = object.getName;
something();

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

请参见关于
this
对象周围放置函数的内容。在案例2中,getName
不起任何作用;这就是为什么会得到与案例1相同的结果。在浏览器中,最后一个示例不会返回undefined,而是返回一个空字符串。调用函数时未设置此值,因此它将默认为全局对象(或在严格模式下未定义,但这不是严格模式代码),这是浏览器中的窗口,并且窗口对象具有默认名称属性,如果未设置为某个值,则将为空字符串。在案例3中,我能否只问一个问题-console.log。返回字符串(?)“结果”。这意味着什么?@不管怎样,
getName
函数仍然会被调用,而
设置为
窗口
,因此您可以看到
窗口的值。name
。谢谢!是的,我认为“这”与3中的全局对象有关。案例,只是“结果”让我困惑,预期“未定义”。。。(jsfiddle:)@nevermind在浏览器中,结果不是未定义的。@Pointy-“…它们影响表达式的解析方式…”实际上应该是“它们对表达式进行分组,并可以影响执行顺序”。因为括号内只有一个表达式,所以执行顺序没有改变。