- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下代码不会引发错误,但我不完全确定原因。在 doubleIt
方法中,我使用对象的名称 returnObject
而不是 this
。
newInstance
实例化后,我希望术语 returnObject
会被复制到新的 doubleIt
方法中。因为 returObject
只存在于工厂函数中,如果 doubleIt
是从 newInstance
调用的,它会混淆 JS 引擎并抛出错误。但是它没有,它工作正常。为什么这仍然有效?
"use strict"
function factoryFunction(x) {
let returnObject = {
oneParameter: x,
doubleIt: () => returnObject.oneParameter * 2
// doubleIt: () => this.oneParameter * 2
// Why don't I have to use the 'this' version?
}
return returnObject;
}
let newInstance = factoryFunction(10);
console.log(newInstance.doubleIt());
最佳答案
javascript 处理这种情况的方式在 this 等文档中有详尽的描述。 .
这对大多数人来说都不容易解析,但要点是首先处理赋值的左侧。因此,在您的示例中,returnObject
获取了对该对象的引用。在评估对象的值之后。所以它看到您正在使用它已经引用的 returnObject
并且能够在运行时查找 oneParameter
属性。所有这些都记录在 closure 中。 ,这意味着返回的对象可以访问名称 returnObject
。
要显示它实际上是在运行时求值,您可以更改 oneParameter
然后调用该函数。它按预期工作:
"use strict"
function factoryFunction(x) {
let returnObject = {
oneParameter: x,
doubleIt: () => returnObject.oneParameter * 2
// doubleIt: () => this.oneParameter * 2
// Why don't I have to use the 'this' version?
}
return returnObject;
}
let newInstance = factoryFunction(10);
newInstance.oneParameter = 100
console.log(newInstance.doubleIt());
另外,returnObject
没有被复制到新的 doubleIt
中——doubleIt
只是有一个指向 returnObject
的引用>.
关于javascript - 在工厂函数中,对象名称和 'this' 关键字是否经常或总是可以互换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951950/
当运行 scala.util.Random().nextInt(3) 81 次时,我看到如下结果(Java 开发人员,请参阅 edit 了解这之间的关系): 200010202002112102222
在使用 native 应用程序在混合模式 C++/CLI 中调试时,我遇到了进程挂起问题。这是无法忍受的,我的调试几乎 70% 都会发生这种情况,我需要一次又一次地重新启动该过程。 是否有任何修补程序
我不知道这是一个错误还是某种误用/错误配置。希望有人能帮忙。谢谢! 如果我更改模块或 list 目录中的文件,通常会导致错误,大部分是以下类型 无法找到节点上的类 在节点上找不到定义类 当 Puppe
我是一名优秀的程序员,十分优秀!