В настоящее время я работаю над некоторыми упражнениями, чтобы лучше понять ключевое слово «это». Кажется, у него много вариантов использования, поэтому я прочитал на 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);
};
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете 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 позволяет мне принимать любую функцию в глобальной области видимости в качестве моего первого аргумента, верно?
Первым аргументом apply будет значение, используемое как this внутри функции. Вероятно, это будет проще с более простым примером — см. редактирование для примера с голыми костями.
В этом случае this относится к текущей области, которая является функцией, в которой содержится this. В JavaScript функции также являются объектами, которым могут быть назначены свойства.
thisэто в зависимости от масштаба.