【问题标题】:Bound function not returning reference to object绑定函数不返回对对象的引用
【发布时间】:2018-02-09 01:49:14
【问题描述】:
let someArgs = {x:1, y:2}
let dog = args => {return args}
let cat = dog.bind(null, someArgs)
someArgs = {x:3, y: 4}
cat() // {x:1, y:2}

谁能解释为什么对cat 的调用没有返回{x:3, y:4}?我以为对象是通过引用传递的?

【问题讨论】:

  • 您正在用新对象替换 someArgs 对象,但原始对象被绑定为 cat 的第一个参数 - 但这是一个不同的对象......替换之间存在差异一个对象并改变一个对象的内容

标签: javascript function bind pass-by-reference partial-application


【解决方案1】:

Javascript 不是按引用传递的(对象 reference 是按值传递的),所以你所期望的不会发生,看看here

【讨论】:

  • 啊哈。所以 someArgs 传递给 bind 将引用内存中的某个部分,并且该函数将使用内存中的该部分进行操作。后来当我设置someArgs = {x:3, y:4} 时,它会在内存中创建一个新部分并将这些值分配给它,而不影响内存中的旧部分(函数引用)。听起来对吗?
  • 另外,当let cat = dog.bind(null, someArgs) 替换为let cat = () => dog(someArgs) 时,返回{x:3, y:4}。为什么这与绑定案例的工作方式有什么不同?
  • let cat = dog.bind(null, someArgs) 中的 someArgs 值(即对对象的引用)被复制,然后在cat() 期间使用。但是在 let cat = () => dog(someArgs) {x:3, y:4} 中,您只需声明函数 cat (不执行),在执行期间仅考虑 someArgs 值。所以它得到了最新的值。
  • @user2535381:区别在于变量someArgs被解析的时间。函数内部的变量只有在函数被调用时才会被解析。在调用箭头函数的那一刻,someArgs 指的是新对象。使用.bind,变量在调用bind 时解析,而不是在调用bind 返回的函数时解析。在调用 bind 的那一刻,someArgs 仍然具有旧值。
【解决方案2】:

在您的代码中,someArgs = {x:3, y:4} 创建新对象,而不是按照建议的方式进行

let someArgs = {x:1, y:2}
let dog = args => {return args}
let cat = dog.bind(null, someArgs)
someArgs = {x:3, y: 4}
cat() // {x:1, y:2}

建议方式:

let someArgs = {x:1, y:2}
let dog = args => {return args}
let cat = dog.bind(null, someArgs)
someArgs.x = 3;
someArgs.y = 4;
cat() // {x:1, y:2}

【讨论】:

  • someArgs = Object.assign(someArgs, {x:3, y: 4})
猜你喜欢
  • 2011-05-01
  • 2016-06-26
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多