К чему относится это ключевое слово в этой ситуации

В настоящее время я работаю над некоторыми упражнениями, чтобы лучше понять ключевое слово «это». Кажется, у него много вариантов использования, поэтому я прочитал на MDN об «этом». Мне интересно, к чему относится ключевое слово «это» в этом упражнении? Я знаю, что когда вы используете apply (который имеет максимум 2 аргумента), ваш первый аргумент — это место, где вы хотите, чтобы это «ключевое слово было сослано», а второй аргумент — это массив, на который ссылается ключевое слово «это». к. на что ссылается return fn.apply(this,arguments); и что такое аргументы во втором аргументе? Это в функции, в окне? Извините, я просто очень запутался и пытаюсь понять это. Это строка кода, которая меня смущает:


function add(a, b) {
  return a + b;
}

function invokeMax(fn, num) {
  var counter = 0;
  return function() {
    counter++;
    if (counter > num) {
      return 'Maxed Out!';
    }
    return fn.apply(this, arguments);
  };
}

this это в зависимости от масштаба.
wahwahwah 09.04.2019 02:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете console.info()this в возвращаемой функции и узнать. Здесь вы увидите, что он указывает на глобальный объект (или окно в браузере). Этот код не зависит от того, является ли this чем-то конкретным. Вы можете переписать его как:

return fn.apply(null, arguments); 

и получить тот же результат.

this определяется способом вызова функций. Функция здесь возвращает функцию, которую (предположительно) вы просто вызовете саму по себе, поэтому единственным контекстом вызова является окно:

function add(a, b) {
  return a + b;
}

function invokeMax(fn, num) {
  var counter = 0;
  return function() {
    counter++;
    if (counter > num) {
      return 'Maxed Out!';
    }
    console.info("this is window?", this === window)
    return fn.apply(this, arguments);
  };
}

let f = invokeMax(add, 2)
console.info(f(5, 6))

Вызов одной и той же функции в другом контексте приводит к другому значению this:

function add(a, b) {
  return a + b;
}

function invokeMax(fn, num) {
  var counter = 0;
  return function() {
    counter++;
    if (counter > num) {
      return 'Maxed Out!';
    }
    console.info("this: ", this)
    return fn.apply(this, arguments);
  };
}

let someObj = {name: "myObj"}
someObj.f = invokeMax(add, 2) // now this will be someObj
someObj.f()

РЕДАКТИРОВАТЬ на основе комментария

Базовый apply() пример. Функция будет использовать объект, переданный первому параметру apply(), как this в функции:

function print(someArg){
  console.info(this.myName, someArg)
}

print.apply({myName: "Mark"}, ["hello"])  // set this to the passed in object
print.apply({myName: "Teddy"}, ["hello"]) // set this to the passed in object
print("hello")                            // called normally `this` will be the widow which doesn't have a `myName` prop.

// but you can give window that property (but probably shouldn't) 
window.myName = "I'm window"
print("hello") 

Мне нравится твое объяснение. Спасибо большое. Просто чтобы убедиться, что я правильно понимаю, fn.apply позволяет мне принимать любую функцию в глобальной области видимости в качестве моего первого аргумента, верно?

Brian Aquino 09.04.2019 02:07

Первым аргументом apply будет значение, используемое как this внутри функции. Вероятно, это будет проще с более простым примером — см. редактирование для примера с голыми костями.

Mark 09.04.2019 02:14

В этом случае this относится к текущей области, которая является функцией, в которой содержится this. В JavaScript функции также являются объектами, которым могут быть назначены свойства.

Другие вопросы по теме