gpt4 book ai didi

javascript - 引用闭包中的对象

转载 作者:行者123 更新时间:2023-11-29 20:59:58 24 4
gpt4 key购买 nike

我正在使用 React,对于有 React 经验的人来说,下面的代码会更容易理解,但是,这是一个 javascript 问题。组件(对象)是使用新的 es2015 类语法创建的。

在下面的代码中,一旦对象被渲染(在 DOM 中),我就会绑定(bind) onmousemove 处理程序(React 特定信息:在方法 componentDidMount 中)。

classSVGParent extends Component{
...

componentDidMount(){
....
this.mainSVGEle.onmousemove = this.throttledMouseMoveHandler();
// one specific detail for non-react devs : the method above
// 'componentDidMount' is called only once the component renders.
}

// the purpose of below func is to localise & create closure for the
// actual handler function (which is returned by this method to the
// 'onmousemove' event listener we appended above).
throttledMouseMoveHandler(){
let { svgState,
... } = this.props;
return( function( e ){
// when this func actually runs, it always returns `false`
// even when the actual svgState.mousemoveState is `true`
console.log( svgState.mousemoveState );
});
...
}

按照上面的代码,在我的代码中,我在组件渲染时立即调用函数 throttledMouseMoveHandler。此函数的目的是创建一个闭包,其中包含每次后续 mousemove 调用所需的信息。

我的预期:我预计 svgState(我在“throttledMouseMoveHandler”中进行本地化)将保存对 Prop “s​​vgState”的 reference,& 当调用 mousemove 时,svgState.mousemoveState 的 Prop 值将从保存值的原始对象中检索。

我遇到的情况:svgState.mousemoveState 永远不会改变。即使我看到原始对象 svgState.mousemoveState 是 true,我仍然得到 false 作为返回值。这让我很惊讶。

抱歉,我的问题很开放,这是什么原因。当然,状态对象的副本没有存储在闭包中并且连接是实时,对吗?

我在下面做了一个简单的例子来说明我的理解。

var aobj = { a : 1 }

var bobj = function(){
var aref = aobj;
return( function(){
console.log( "aref is...", aref.a);
});
}

var bfunc = bobj();
bfunc(); // returns `aref is... 1`, which is expected

aobj.a = 2

bfunc() // returns `aref is... 2`, which is also expected
// so clearly the reference to external obj is live

最佳答案

I expected svgState would hold reference to the prop 'svgState'

没有。 svgState 保存 this.props.svgState 在调用 throttledMouseMoveHandler 时的值。 (当然,该值是一个引用其 .mousemoveState 属性的对象)

… and when onmousemove is called, the prop value of svgState.mousemoveState would be retrieved from the original obj holding the values.

是的。它将获取对象的 .mousemoveState 属性的当前值。

但是,如果您说记录 this.props.svgState.mousemoveState 会产生 true 而闭包会产生 false,看起来就像这样有人确实将 .props.svgState 属性更改为与闭包内存中不同的对象。

关于javascript - 引用闭包中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47076481/

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