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

Метод — это функция, связанная с объектом.

› var obj = {
… f1:function(){
….. return 1;
….. }
… };
undefined
› f1();
ReferenceError: f1 не определен

Q) Что такое суффиксный оператор?
A) Вызов функции называется суффиксным оператором.
f1() — пара фигурных скобок после f1 является суффиксным оператором.

Если функция вызывается со слишком большим количеством аргументов, лишние аргументы игнорируются. Если функция вызывается со слишком малым количеством аргументов, остальные аргументы получают значение undefined. Обратите внимание, что в обоих случаях функция будет выполняться не так, как будут вести себя такие языки, как Java, что приведет к ошибке, говорящей, что сигнатура функции не совпадает.

В) Если функция с двумя определенными параметрами вызывается с пятью параметрами, будут ли все пять параметров доступны в массиве аргументов?
А) Да, это правильно.

Q) Таким образом, JavaScript не заботится о количестве аргументов, переданных во время вызова функции. Проверяет ли он тип переданного параметра?
A) Нет — для параметров также нет проверки типа.

В) Типичный способ вызова функции — f1(). Функции также могут вызываться как метод объекта как obj.f1(). Существуют ли какие-либо другие способы вызова функции?
A) Существует четыре способа вызова функции.
Наиболее распространенный способ вызова функции, как вы упомянули, называется f1(). как форма вызова функции.
1) FunctionForm
f1(arg1,arg2)
Вторая форма вызова, о которой вы упомянули, называется формой метода .
2) MethodForm
obj.f1()
Существует два варианта формы метода.
точечная форма, которая является типичным механизмом obj.f1().
суффиксная форма, которая является obj[f1]().
Это происходит из-за того, как объект может получить доступ к своим членам — obj.keyOne или obj[keyOne]. В этом случае член является функцией, просто чтобы получить функцию, вы должны сделать obj.f1 или obj[f1], и вы получите определение функции.
Поверх этого добавляется суффиксный оператор () фактически вызвать функцию
obj.f1() или obj[f1]()

В) Могу ли я узнать, как это используется в функциях?
А) Конечно.
1) это можно использовать при определении функции. То есть функция может иметь операторы, которые ссылаются на ключевое слово this. И в зависимости от того, как вызывается функция, объект, который становится this, различается.
2) При определении функции ниже приведен пример того, как this можно использовать в функции.

› var f1 = function() {
… return this.n1 * this.n2;
… };
undefined

Q) Я вижу, как это фигурирует в определении функции. И поймите, что это может отличаться в зависимости от того, как вызывается функция. Итак, каковы способы вызова функции, которые могут привести к тому, что разные объекты станут this?
1) форма применения, где первый параметр — это объект, который будет использоваться как this.

› var obj2 = {
… n1:6,
… n2:7
… };

› f1.apply(obj2);
42

2) форма вызова, где снова первый параметр — это объект, который будет использоваться как this.

› var obj = {
… n1:20,
… n2:5
… };
undefined
› f1.apply(obj);
100

3) вызов метода, где функция является атрибутом объекта.
Функция, являющаяся атрибутом объекта, выглядит так, как показано ниже.

› var classObj = {
… f1: function() {
….. return this.n1 * this.n2;
….. },
… n1:2,
… n2:5
… };

Функциональность и текст кода функции точно такие же в трех приведенных выше примерах, и меняется только способ вызова функции и, следовательно, то, что передается при этом изменении.

Форма вызова метода приводит к тому, что содержащий объект будет this.
Код для вызова метода приведен ниже, и обратите внимание, что значения n1 и n2 используются из объекта.

› classObj.f1();
10

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

› var f1 = function() {
… return this.n1 * this.n2;
… };
undefined
› f1();
NaN

В) Внутренние функции необходимы для закрытия, и это меня действительно интересует. Давайте углубимся во внутренние функции и их отношения с внешними функциями.
А) Конечно. Давайте напишем простую внешнюю функцию, в которой есть пара внутренних функций.

› var external = function () {
… var n1 = 10;
… var n2 = 5;
… var getN1 = function() {
….. return n1;
….. };
… var getN2 = function() {
….. return n2;
….. }
… return getN1()*getN2 ();
… };

Давайте также посмотрим на выполнение и убедимся, что внутренняя функция имеет доступ к переменным, определенным во внешней функции, и что внешняя функция может видеть внутренние функции внутри нее.

› внешний();
50

Внешний метод работал просто отлично. Это доказывает, что функция с именем external имеет доступ к функциям getN1 и getN2.
Это также доказывает, что внутренние функции getN1 и getN2 имеют доступ к переменным n1 и n2, определенным во внешней функции. Пока это отношения мечты.

Q) Действительно — это выглядит хорошо. Может ли одна внутренняя функция видеть другую функцию, определенную на том же уровне?
A) Исходя из следующего примера, не похоже, что одна внутренняя функция может видеть другую внутреннюю функцию с глазу на глаз, как в виде прямой ссылки что имеет смысл, поскольку JavaScript имеет область действия. Мы просто знаем, что на данный момент это не работает, если честно.

› var external = function() {
… var n1 = 10;
… var n2 = 5;
… var getN1 = function() {
….. return n1;
….. };
… var product = function() {
….. getN1() * n2;
….. };
… return product ();
… };
undefined
› external();
undefined

Итак, давайте напишем еще одну функцию, в которой родственная функция является просто вызовом внутренней функции, а внешняя функция при выполнении вызывает родственную функцию, и, поскольку внешняя функция возвращает неопределенное значение, я убежден, что родственные функции не могут видеть друг друга глазами. глаз без какого-либо механизма проводки.

› var external = function() {
… var n1 = 5;
… var getN1 = function() {
….. return n1;
….. };< br /> … var getN1Sibling = function() {
….. return getN1();
….. };
… getN1Sibling();
… };
undefined
› external();

› external();
не определено

В) Итак, допустим, что внутренние функции не могут видеть друг друга так же ясно, как внешние функции могут видеть внутренние функции. Есть ли причина, по которой одна внутренняя функция должна видеть другую внутреннюю функцию?
A) В контексте того, что внутренние функции помогают создавать функциональность внешней функции, справедливо, чтобы одна внутренняя функция имела доступ к другой. внутренняя функция, которой уже владеет внешняя функция, чтобы помочь внутренней функции выполнять свою работу. Помоги мне, помоги тебе.

В) Это звучит справедливо. Может ли одна внутренняя функция вызывать другую внутреннюю функцию через внешнюю функцию, поскольку внешняя функция может видеть обе внутренние функции и должна быть в состоянии их соединить?
A) Возможно — первым шагом в этом будет то, что внутренняя функция иметь доступ к внешней функции в первую очередь.

В) Ах, это правильно. Давайте сначала зайдем так далеко. Как внутренняя функция обращается к внешней функции. Через ключевое слово это может быть? это похоже на настройку контекста для вызова функции.
A) Это определенно звучит как справедливое ожидание от языка. Например, innerFunctionOne будет обращаться к innerFunctionTwo как this.innerFunctionTwo. Это звучит возможно. Давайте попробуем.

› var external = function() {
… var inner1 = function() {
….. return 5;
….. };
… var inner2 = function() {
….. return this.inner1();
….. }
… inner2();
… }
› external();
Ошибка типа: this.inner1 не является функцией

Это очень четко выдало ошибку, говоря, что this.inner1 не является функцией.

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

Q) В чем разница между call и формой вызова функции apply?
A) И call, и форма вызова функции apply имеют первый параметр как объект, который будет обрабатываться как this. Разница в том, что для формы вызова остальные параметры передаются по отдельностикак отдельные параметры, а для формы подачи заявки остальные параметры передаются в виде массива.

Форма вызова работает нормально, когда параметры перечислены один за другим.

› var f1 = function ( n1,n2,n3) {
… return n1 + n2 + n3;
… };
undefined
› f1.apply(null,1, 2,3);
TypeError: CreateListFromArrayLike вызывается для необъекта
› f1.call(null,1,2,3);
6

Метод вызова apply принимает в качестве параметров массив.

› f1.apply(null, [1,2,3]);
6