Javascript 函数赋值后未定义
Javascript this undefined after function assignment
所以我正在阅读面向 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 两边加上括号有什么作用?到目前为止我只知道你可以在匿名函数周围加上括号来立即调用它(立即调用函数表达式)。但是如果函数不是匿名的呢?
案例三:为什么赋值后this
不维护了?
这里的问题真的和this
改变没有任何关系。第三种情况的不同之处在于用作函数引用的值已经失去了与上下文对象的关系。
当通过评估对象 属性 引用获得函数引用,然后调用该函数时,JavaScript 确保函数中的 this
设置为对象涉及。这就是前两种情况的工作方式。
第三种情况,函数引用本来是从对象中获取的,但是整体的值
(object.getName = object.getName)
是 =
赋值的值。因此,与对象的关系被打破,你所得到的只是一个函数的引用。因此调用不会设置 this
。就好像你写了:
var something = object.getName;
something();
这也不会将 this
设置为 object
。只有当函数引用直接来自 .
或 [ ]
操作时,所涉及的对象才会在调用中以 this
结束。情况 2 中的括号是一种特殊情况;在 JavaScript 中,括号不计算任何值;它们会影响表达式的解析方式,但不会主动执行任何操作。
所以我正在阅读面向 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 两边加上括号有什么作用?到目前为止我只知道你可以在匿名函数周围加上括号来立即调用它(立即调用函数表达式)。但是如果函数不是匿名的呢?
案例三:为什么赋值后this
不维护了?
这里的问题真的和this
改变没有任何关系。第三种情况的不同之处在于用作函数引用的值已经失去了与上下文对象的关系。
当通过评估对象 属性 引用获得函数引用,然后调用该函数时,JavaScript 确保函数中的 this
设置为对象涉及。这就是前两种情况的工作方式。
第三种情况,函数引用本来是从对象中获取的,但是整体的值
(object.getName = object.getName)
是 =
赋值的值。因此,与对象的关系被打破,你所得到的只是一个函数的引用。因此调用不会设置 this
。就好像你写了:
var something = object.getName;
something();
这也不会将 this
设置为 object
。只有当函数引用直接来自 .
或 [ ]
操作时,所涉及的对象才会在调用中以 this
结束。情况 2 中的括号是一种特殊情况;在 JavaScript 中,括号不计算任何值;它们会影响表达式的解析方式,但不会主动执行任何操作。