Javascript函数赋值后,此函数未定义
因此,我在阅读《面向Web开发人员的专业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)()
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-“…它们影响表达式的解析方式…”实际上应该是“它们对表达式进行分组,并可以影响执行顺序”。因为括号内只有一个表达式,所以执行顺序没有改变。