理解JavaScript中的bind()
根据MDN: 调用理解JavaScript中的bind(),javascript,ecmascript-5,ecma,Javascript,Ecmascript 5,Ecma,根据MDN: 调用f.bind(someObject)将创建具有相同主体的新函数 和范围为f,但在原始函数中出现这种情况时 新函数它被永久绑定到bind的第一个参数, 无论函数是如何使用的: 但当我尝试下面的代码时: var模块={ x:42, getX:function(){ 归还这个.x; } } var unboundGetX=module.getX; console.log(unboundGetX());//该函数在全局范围内被调用 //预期输出:未定义 var boundGetX=u
f.bind(someObject)
将创建具有相同主体的新函数
和范围为f
,但在原始函数中出现这种情况时
新函数它被永久绑定到bind
的第一个参数,
无论函数是如何使用的:
但当我尝试下面的代码时:
var模块={
x:42,
getX:function(){
归还这个.x;
}
}
var unboundGetX=module.getX;
console.log(unboundGetX());//该函数在全局范围内被调用
//预期输出:未定义
var boundGetX=unboundGetX.bind(模块);
console.log(boundGetX());//预期产出:42
模块x=43;
boundGetY=boundGetX.bind(模块);
console.log(boundGetY());//这不应该是42吗?
我没有理解您所困惑的内容-它看起来像是按照所描述的那样工作
module.x
的值更改为43unboundGetX.bind(module)
-ie来创建一个新方法boundGetY
,即boundGetY引用的此
是模块
李>
boundGetY()
-它引用这个.x
,它是模块.x
的值,43李>
这里module是一个常数,但module.x不是。这就是您可以更改module.x值但无法更改module的原因
因此,您正在更改模块的值,而不是模块本身。当您更改同一对象的值时,您没有绑定另一个对象,因此该值会更改
var模块={
x:42,
getX:function(){
归还这个.x;
}
}
var unboundGetX=module.getX;
console.log(unboundGetX());//该函数在全局范围内被调用
//预期输出:未定义
var boundGetX=unboundGetX.bind(模块);
console.log(boundGetX());//预期产出:42
变量模块2={
x:43,
getX:function(){
归还这个.x;
}
}
boundGetY=boundGetX.bind(模块);
log(boundGetY())模块后的code>x=43代码>行运行时,module.x
是43,而不是42,所以您看到43了吗?在这一点之后,内存中的任何地方都没有42,为什么您希望看到42?@CertainPerformance,因为他们说bind()
是永久的,并且在第一个参数传递给它时只工作一次?不,它不只工作一次,您可以继续调用绑定函数任意多次,而且.bind
不会深度克隆新的这个或类似的东西
function f() {
return this.a;
}
var g = f.bind({a: 'azerty'});
console.log(g()); // azerty
var h = g.bind({a: 'yoo'}); // bind only works once!
console.log(h()); // azerty
var o = {a: 37, f: f, g: g, h: h};
console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, azerty