Что означает «с обычной функцией this» представляет объект, который вызывает функцию »? - PullRequest
1 голос
/ 31 января 2020

В объяснении функций стрелок w3schools говорит: «В обычных функциях ключевое слово this представляет объект, который вызвал функцию, которая может быть окном, документом, кнопкой или чем-то другим» и «С обычной функцией, которая представляет объект, который вызывает функцию ". Ссылка: https://www.w3schools.com/js/js_arrow_function.asp

Я пытаюсь понять это предложение не в отношении функций со стрелками, а само по себе. Кажется, что многие другие источники, которые я обнаружил в net, противоречат этому, говоря, что когда функция вызывается сама по себе (не как метод), «this» связывается либо с объектом верхнего уровня (например, с окном), либо с неопределенным в зависимости от строгого режима.

Итак, я построил простой пример (работает не строго в браузере) Я не хотел использовать примеры с сайта w3schools, потому что они используют обработчики событий для объяснения, и я хочу убедиться, что я избегаю любых дополнительных логик привязки c, которые вводят обработчики событий.

<script type="text/javascript">

function foo() {
    console.log('foo on ' + this.prop);
}

function bar() {
    console.log('bar on ' + this.prop);
    var f = this.foo;
    f();
}

var x = {
    prop: 'x'
};
window.prop = 'w';

x.foo = foo;
x.bar = bar;
x.bar();

</script>

Это регистрирует: «bar on x» и «foo on w», что, по-видимому, указывает на то, что в foo это относится к окну. Очевидно, что объяснение w3schools НЕ относится к автоматическому c связыванию foo's this с bar this, когда foo вызывается внутри bar. Но что еще это значит?

1 Ответ

3 голосов
/ 31 января 2020

Хорошо, давайте начнем с предпосылки, что у W3Schools репутация менее чем звездная, и вам не следует слишком задумываться о том, что они пишут. Фактически, вместо этого лучше читать MDN .

В обычных функциях ключевое слово this представляет объект, вызвавший функцию ...

Ну да, нет ... Объект ничего не вызывает. Объект просто есть. Это контейнер других вещей. Одним из таких «вещей» может быть функция. Тогда у вас может быть код , который берет функцию из этого «контейнера» и вызывает ее. Итак, код вызывает функции , независимо от того, являются ли эти функции свойством объектов или иным образом.

Как определяется this внутри этой функции, зависит точно от того, как этот код вызывает функцию. В двух словах, в выражении a.b(), this внутри b будет a. Как правило, this внутри функции будет тем, что было до ., когда она была вызвана.

Если до вызова не было ., например, просто b(), нет this (как именно это проявляется, зависит от строгого режима). Неважно, была ли эта функция изначально частью объекта или нет; все, что имеет значение, это точное выражение, которое использовалось для его вызова.

Для всех подробностей вы можете увидеть Как работает ключевое слово «this»? .

Сноска здесь в том, что вы можете bind this для функции или передать другую this явно, используя call или apply и функции жирной стрелки вообще не следуют этому правилу.

...