【问题标题】:The bind method of javascript seems not working as expectedjavascript 的绑定方法似乎没有按预期工作
【发布时间】:2017-08-11 03:10:37
【问题描述】:

var obj = {
    say: function() {
        function _say() {
            console.log(this);
        }
        return _say.bind(obj);
    }()
};

obj.say();

代码结果是注销全局或窗口,我想知道为什么bind方法没有将'this'绑定到obj对象上下文?

【问题讨论】:

  • 这里真正的问题是如果你需要this 绑定,你为什么不使用一个实际的object-with-prototype?您展示的代码试图将“实例逻辑”放入“无实例”代码中,您可以做到这一点,它是 JavaScript,但它也真的……很傻?你实际上想用这段代码做什么? (或使用这样的代码)
  • (1) 在return _say.bind(obj); 行设置断点。 (2) 当它停在那里时,检查obj 的值。 (3) 认真思考。 (4) 向您的rubber ducky 解释为什么您尝试将 IIFE 的结果分配给属性say
  • 感谢您的 cmets,@Mike 'Pomax' Kamermans。这段代码只是练习,我想知道为什么'this'在使用bind(undefined)时是全局的。
  • 如果您是规范潜水,这是一个合理的问题,但您展示的代码绝对不值得在您打算实际使用的任何真实文件中使用,或者更糟糕的是,让其他人在处理 =)跨度>

标签: javascript this bind iife


【解决方案1】:

在赋值过程中,变量obj 仍然没有任何值。因此,您对 bind 的调用等同于 .bind(undefined),其行为方式与您观察到的一样。

更具体地说,thiswindow 是因为OrdinaryCallBindThis 做了以下步骤(非严格模式):

[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].

您可以在调用后在 chrome 调试器中检查 [[BoundThis]] 确实是 undefined

【讨论】:

  • 感谢您的回答,@ASDGerte。但是如果 _say 函数将 'this' 绑定到 'undefined',为什么 obj.say() 中的 'this' 绑定到 global/window 而不是 obj?
  • @smallbone 已编辑。我也是在回答后才搜索的:)
  • 我明白了!非常感谢。
【解决方案2】:

您正在立即调用该函数。删除 say 函数后面的括号。如果您希望在没有两个连续括号 obj.say()() 的情况下调用函数,请使用 .call() 而不是 .bind()

var obj = {
  say: function() {
    function _say() {
      console.log(this);
    }
    return _say.call(this);
  }
};

obj.say();

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2016-01-24
    • 1970-01-01
    • 2022-12-17
    • 2013-11-29
    • 2021-06-07
    • 2013-02-10
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多