Javascript - 使用setTimeout回调中的`this`绑定

时间:2016-08-21 17:34:38

标签: javascript node.js

在下面的代码中,当gs对象上调用this时,this绑定的是什么?我的理解是.绑定到点(GreetingService)运算符左侧的东西,在这种情况下应该是gs对象this.name。但是,在这种情况下,sayAsyncHi fn中的undefined会出现在// file greeting_service.js function GreetingService(name) { this.name = name; this.sayHi = function () { console.log(this); console.log(`Hi ${this.name}!`); } this.sayAsyncHi = function () { setTimeout(function (params) { console.log(this); console.log(`Hi ${this.name}!`); },2000); } this.sayBye = function () { console.log(`Bye ${this.name}!`); } } var gs = new GreetingService('Jon'); gs.sayHi(); // Hello Jon! gs.sayAsyncHi(); // Hello undefined! 中 - 为什么会这样?

node greeting_service.js

运行GreetingService { name: 'Jon', sayHi: [Function], sayAsyncHi: [Function], sayBye: [Function] } Hi Jon! Timeout { _called: true, _idleTimeout: 2000, _idlePrev: null, _idleNext: null, _idleStart: 389, _onTimeout: [Function], _repeat: null } Hi undefined! (nodejs 6)

时的输出
    $scope.GetAllSnimateljiBaseInfo = function () {

    $http.get(serviceBase + "GetAllSnimateljiBaseInfo", { timeout: 6000 })
    .success(function (response) {
        $scope.snimatelji = response;
        $scope.snimatelji.splice(0, 0, { "IDsnimatelj": 0, "Ime": "", "Prezime": "" });
        $scope.selectedSnimateljInfilterVideoKlip = $scope.snimatelji[0];
    })
     .error(function (response, status) {
         if (status == 401) {
             $state.go('/');

         }
         else {
             alert(response.Message);
         }
     });
};

PS:使用ES6箭头功能,绑定正确,正如上述异步调用所期望的那样

1 个答案:

答案 0 :(得分:1)

一个小修补程序(我添加了.bind(this)):

this.sayAsyncHi = function () {
  setTimeout(function (params) {
    console.log(this);
    console.log(`Hi ${this.name}!`);
  }.bind(this), 2000);
}

修改

一点解释:在sayAsyncHi中,您会发现this变量具有您期望的值。但是传递给setTimeout的函数没有绑定到this的任何值。如果需要特定值,则需要显式绑定它。