这是对function.prototype.bind()-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
的MDN说明的链接。我添加了一些console.logs以帮助我了解正在发生的事情。
var module = {
x: 42,
getX: function() {
return this.x;
}
};
var boundGetX = module.getX.bind(module);
console.log(boundGetX());
console.log(boundGetX().x);
console.log(boundGetX.x);
第一个console.log返回
42
这对我来说很有意义。
但是,第二个和第三个console.logs返回
undefined
那是为什么?函数如何能够查看和记录存储值为42的模块属性x,而x的boundGetX
值未定义?
使用bind函数后,boundGetX
现在是否指向module.getX
,'this'变量是否指向模块?
为什么boundGetX.x
不能指向module.x
?并在未定义module.x
的情况下如何成功记录boundGetX.x
的值?
答案 0 :(得分:3)
致电时:
console.log(boundGetX().x);
您实际上是在打电话:
this.x.x
实际上在做什么:
(42).x // there's no property x on the number 42
并且由于属性x
上没有属性x
,因此它是undefined
。
答案 1 :(得分:1)
bind()方法创建一个新函数,该函数在调用时具有 此关键字设置为提供的值,并按给定顺序 调用新函数时所提供的参数之前的所有参数。
bind function更改了this
的含义,在您的情况下,您将module
设置为在this
函数中解析为getX
:
getX: function() {
return this.x; // <-- this is now `module` object so `x` resolves to 42
}
这就是console.log(boundGetX());
现在可以打印42
的原因,因为您实际上是通过module.x
函数来打印module.getX
的。
现在这两个:
console.log(boundGetX().x);
console.log(boundGetX.x);
不再有意义,因为您将boundGetX
绑定到getX
函数,并且该函数没有x
属性,也没有返回x
属性,它仅返回< x的strong>值。