在javascript中对bind()感到困惑

时间:2014-05-12 01:45:33

标签: javascript anonymous-function

我从本教程中提取了以下代码:tutorial

如果你可以将它从父函数绑定到匿名内部函数,那么如果你想稍后在匿名内部函数中引用“this”,你会怎么做?匿名内部函数不存在“this”吗?

render: function () 
{

    this.getAsyncData(function () {

        this.specialFunction();

        this.anotherSpecialFunction();

    }.bind(this));

}

4 个答案:

答案 0 :(得分:3)

  

如果你想稍后在匿名内部函数中引用“this”,你会怎么做?

如果我们没有调用this,则无法引用回调所具有的.bind的值。

但是,您不必使用.bind,还有其他方法可以使用“父”功能的this值:How to access the correct `this` context inside a callback?

  

匿名内部函数不存在“this”吗?

this每个函数中的隐含值。它具有哪个值取决于函数如何调用,除非该函数明确绑定到某个值(通过.bind)。

例如,如果您“正常”调用某个函数,例如func(),则this将引用全局对象(浏览器中为window)。 API文档通常会解释回调中的this值。如果它没有明确提及任何内容,那么你可以假设this引用了全局对象,这在大多数情况下都不是很有用,因此通过{{1}“覆盖”它是没有问题的。 }。
但即使.bind在回调中设置为特定值,该值也经常作为参数传递给回调。能够通过this访问该值只是为了方便。但同样,这取决于API的设计方式,通常在API文档中进行了解释。


有关this的详细信息,请查看MDN documentation

答案 1 :(得分:1)

每次调用函数时都会设置this上下文。如果没有上下文(大多数回调的情况),则this将丢失。

更常见的是:

var self = this;
// code using self instead of this here

由于.bind相对较新,上述内容更兼容浏览器。

答案 2 :(得分:0)

当您进行匿名回调时,this通常会引用window对象。一个很好的例子是setTimeout

var someObject = {
    set: function() { /* ... */ },
    doSomething: function() {
        // right here, "this" is "someObject"
        setTimeout(function() {
            // whereas right here, "this" is "window"
        });
    }
}

很多人都是这样解决这个冲突的:

var someObject = {
    set: function() { /* ... */ },
    doSomething: function() {
        var that = this;

        setTimeout(function() {
            console.log(that) // => now it refers to "doSomething"
        });
    }
}

bind发挥作用的地方。

请参阅此jsfiddle

var someObject = {
    set: function() { /* ... */ },
    doSomething: function() {
        setTimeout(function() {
            console.log(this) // => now it refers to "doSomething"
        }.bind(this));
    }
}

修改

菲利克斯克林对这个答案做了很好的评论。对于此答案,我假设您正在调用someObject.doSomething(),而不是将doSomething()方法称为不同的上下文。

答案 3 :(得分:0)

如果你可以将它从父函数绑定到匿名内部函数,那么如果你想稍后在匿名内部函数中引用“this”,你会怎么做?

如果您想引用外部this,然后将this设置为变量而不使用bind,则无法使用。

var that = this;

匿名内部函数不存在“this”吗?

this始终存在。

简单示例:

this.name = 'Bob';

function sayHello() {
  return ['Hello,', this.name].join(' ');
}

console.log(sayHello()); // "Hello, Bob"
console.log(sayHello.bind({name: 'Ana'})()); // "Hello, Ana"

http://jsbin.com/xibis/1/edit