function.call () возвращает глобальный this - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь привязать объект пользователя как этот и время по умолчанию в качестве первого параметра, используя function.call метод

let user = {
  name:'rifat',
  txt (time, msg){
    console.log('['+time+ '] '+ this.name+ ' : '+ msg);
  }
}


function bind(func, ...fArgs){
  return function(...args){
    return func.call(this, ...fArgs, ...args);
  };
}

let txt =  bind(user.txt, new Date().getHours()+':' +new Date().getMinutes() );

txt('hey!');

, почему этот код возвращает неопределенное имя. Работает в узле 10.16.0.0

[18:21] undefined : hey!

Ответы [ 2 ]

4 голосов
/ 30 сентября 2019

То, что вы хотите сделать, фактически поддерживается самой нативной bind.

let user = {
  name:'rifat',
  txt (time, msg){
    console.log('['+time+ '] '+ this.name+ ' : '+ msg);
  }
}

let txt =  user.txt.bind(user, new Date().getHours()+':' +new Date().getMinutes());

txt('hey!');

Вывод:

[18:11] rifat : hey!

Вы можете узнать больше о частичных функциях здесь

0 голосов
/ 01 октября 2019

Хорошо, спасибо всем за ваши предложения и комментарии. Я думаю, что нашел то, что сделал не так.

Я сохранял возвращение функции связывания в переменной txt, которая теряет this. Что мне нужно было сделать, это заменить user.txt на функцию возврата или сохранить ее вдругое user значение объекта, например user.txtBound

, правильная версия кода будет

let user = {
  name:'rifat',
  txt (time, msg){
    console.log('['+time+ '] '+ this.name+ ' : '+ msg);
  }
}


function bind(func, ...fArgs){
  return function(...args){
    return func.call(this, ...fArgs, ...args); // here 'this' will be determined 
                                                //when the returned function executes
  };
}

user.txt =  bind(user.txt, new Date().getHours()+':' +new Date().getMinutes() ); 
// storing the returned function as a object property

user.txt('hey!'); //this works fine


, эта просто отлично работает.

Извините за беспокойство, я экспериментировал :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...