В Javascript у нас есть нечто, называемое this
. this
— это ключевое слово, которое ссылается на значение, обычно на объект, который ссылается на текущий контекст выполнения. Я знаю, что это может сбивать с толку. Давайте немного помедлим.
Что такое контекст выполнения?
Контекст исполнения скважины в терминах неспециалиста объем значения/объекта.
Таким образом, текущим контекстом выполнения будет текущая область действия ключевого слова this
, на которое ссылается.
Например, если вы ведете консольный журнал this
в браузере, он будет ссылаться на глобальный объект, который предоставляет javascript.
// In web browsers, the window object is also the global object:
console.log(this === window); // true
Когда вы используете this
внутри функции, значение this будет зависеть от того, как оно вызывается.
Например,
function basicFunc() { return this; } // In a browser, the basicFunc
refers to the global objectbasicFunc() // window
function getValueOfthis() { console.log(this); } const newObject = { text: "Hello World", getValueOfthis } // In a browser, the current context would changed to newObject newObject.getValueOfthis(); /* Output: { getValueOfthis: function getValueOfthis() { console.log(this); }, text: "Hello World" } */
Зачем нам нужен this
?
this
может быть очень полезным инструментом при разработке приложения. Это помогает разработать метод и свойство вокруг объекта. Еще одно преимущество заключается в том, что это помогает вам поддерживать тесную связь между данными и функциональностью.
Какой смысл в связывании, вызове и применении?
Привязка, вызов и применение помогают изменить текущий контекст выполнения для вашего this
let newAgent = { name: 'Burt Macklin' }; functionmodifyAgent
() { this.name = 'Andy Dwyer'; return this.name; } console.log(modifyAgent
()); // 'Andy Dwyer' console.log(newAgent.name); // 'Burt Macklin'
В приведенном выше примере modifyAgent
— это функция, которая изменит имя агента и вернет его обратно. Но проблема в том, что наш объект и функция объявлены отдельно. Следовательно, значение после вызова функции и объекта различно. Если мы используем связывание, вызов или применение, мы можем дать модифицирующему агенту необходимый контекст и иметь согласованное поведение.
let newAgent = { name: 'Burt Macklin' }; function modifyAgent() { this.name = 'Andy Dwyer'; return this.name; } /* Notice: bind() will create a new function while call and apply instantly calls the function */ const bindContext = modifyAgent.bind(newAgent); console.log(bindContext()); // 'Andy Dwyer' console.log(modifyAgent.call(newAgent)); // 'Andy Dwyer' console.log(modifyAgent.apply(newAgent)); // 'Andy Dwyer' console.log(newAgent.name); // 'Andy Dwyer'
Вот как нам помогают bind(), call() и apply().
Я знаю, что это, вероятно, было плохим объяснением основных понятий, таких как this
, bind
, call
и apply
. Но вот несколько ресурсов для дальнейшего чтения: