为什么在使用绑定函数(javascript)之后属性未定义?

时间:2018-12-09 18:52:26

标签: javascript pointers undefined bind

这是对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的值?

2 个答案:

答案 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>值。