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