gpt4 book ai didi

javascript - 在工厂函数中,对象名称和 'this' 关键字是否经常或总是可以互换?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:50 24 4
gpt4 key购买 nike

以下代码不会引发错误,但我不完全确定原因。在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com