Javascript 厂内函数是对象名和';这';关键词经常或总是可互换的?

Javascript 厂内函数是对象名和';这';关键词经常或总是可互换的?,javascript,this,Javascript,This,下面的代码没有抛出错误,但我不完全确定原因。 在doubleIt方法中,我使用对象的名称returnObject而不是this 在实例化newInstance之后,我希望术语returnObject将被复制到新的doubleIt方法中。因为如果从newInstance调用doubleIt,则returObject仅存在于工厂函数中,这将混淆JS引擎并引发错误。不管它怎么做,它都能正常工作。为什么这仍然有效 “使用严格的” 函数工厂函数(x){ 让returnObject={ 一个参数:x, d

下面的代码没有抛出错误,但我不完全确定原因。 在
doubleIt
方法中,我使用对象的名称
returnObject
而不是
this

在实例化
newInstance
之后,我希望术语
returnObject
将被复制到新的
doubleIt
方法中。因为如果从
newInstance
调用
doubleIt
,则
returObject
仅存在于工厂函数中,这将混淆JS引擎并引发错误。不管它怎么做,它都能正常工作。为什么这仍然有效

“使用严格的”
函数工厂函数(x){
让returnObject={
一个参数:x,
doubleIt:()=>returnObject.oneParameter*2
//doubleIt:()=>this.oneParameter*2
//为什么我不用这个版本?
}
返回对象;
}
设newInstance=factoryFunction(10);

log(newInstance.doubleIt())javascript处理此类情况的方式在以下文档中有详细描述:

对大多数人来说,这并不容易解析,但要点是首先处理赋值的左侧。因此,在您的示例中,
returnObject
获取对该对象的引用。之后,将计算对象的值。因此,它可以看到您使用的是
returnObject
,它已经引用了该对象,并且能够在运行时查找
oneParameter
属性。所有这些都被捕获到一个文件中,这意味着返回的对象可以访问名称
returnObject

要显示它实际上是在运行时进行计算,可以更改
oneParameter
,然后调用该函数。它按预期工作:

“使用严格的”
函数工厂函数(x){
让returnObject={
一个参数:x,
doubleIt:()=>returnObject.oneParameter*2
//doubleIt:()=>this.oneParameter*2
//为什么我不用这个版本?
}
返回对象;
}
设newInstance=factoryFunction(10);
newInstance.oneParameter=100

log(newInstance.doubleIt())JavaScript面向对象与“经典”面向对象不同。创建新对象时,returnObject假定为“this”,因为它就是对象。

闭包捕获其环境变量。由于returnObject被定义为闭包外部的变量,因此它将被闭包捕获

在这种情况下,将创建一个循环引用,其中闭包doubleIt()将引用returnObject,而returnObject将引用doubleIt()

关于“this”,在您的示例中,它指的是窗口对象,因为工厂函数不是用“new”调用的。如果使用“new”调用它,那么它将引用factoryFunction。但是,它永远不会引用returnObject,因为returnObject本身从来没有用“new”调用过。为了使“this”指向doubleIt()中的returnObject,您需要为returnObject定义一个函数,该函数将用new调用。如果在调用factoryFunction时使用或不使用“new”,则以下代码段将起作用:

函数工厂函数(x){
让returnObject=函数(x){
this.oneParameter=x;
this.doubleIt=()=>this.oneParameter*2;
};
返回新的returnObject(x);
}
设newInstance=factoryFunction(10);
设另一个newInstance=newFactoryFunction(10);
log(newInstance.doubleIt());

log(另一个newInstance.doubleIt())神圣的烟!好的,当创建新对象时,returnObject将成为对位置的引用。使用对象名而不是
是构造该语句的合法方式,还是在V8引擎的下一次更新时可能会崩溃?非常感谢!嗯,你不能像使用箭头功能那样使用
这个
。如果使用正则函数表达式,它将起作用。但是如果您这样做,那么
this
的值将取决于函数的调用方式,而显式使用
returnObject
将始终是相同的。p、 如果你用函数表达式而不是胖箭头来定义它的话,这个
returnObject
中很好地工作。仅限我们:
doubleIt:function(){return this.oneParameter*2}
将引用调用上下文,因此您可以将其称为
newInstance.doubleIt()
它将正常工作。是的,没错。如果不需要箭头函数,那么普通函数就可以了。谢谢@Mark\M