Синтаксис JavaScript гибкий, и нередко имеет пять или шесть методов реализации для той же функции. Затем, в сочетании с некоторым античеловеческим прототипом наследование и асинхронные особенности, это еще более запутанно. Я часто не понимаю разницы между вызовом и применением, поэтому я запишу его сегодня, чтобы не забыть снова.
В JavaScript методы могут быть выполнены следующими способами:
1.func () является наиболее прямым и общим способом призывы, и это также соответствует мыслительной логике обычных людей, но в некоторых случаях есть некоторые недостатки, которые будут объяснены ниже.
2. (function (arg) {}) (окно), анонимный вызов метода, более полезен при создании пространства имен. Параметры в следующих скобках соответствуют входящим параметрам в анонимном методе один за другим.
3.func.bind (sth) (). В руководстве Mozilla упоминается, что Bind является новой функцией, добавленной в 5-м издании ECMA-262. Он перечислен отдельно как вызовный метод, потому что он компенсирует дефект, что область применения не может быть связано с прямыми вызовами.
4.func.call (), это второй способ призвания. Каждый метод имеет метод вызова, определенный в прототипе для выполнения текущего метода.
5.func.apply (), брат -близнец Call.
func ()
Это наиболее распространенный способ звонить, и его можно увидеть повсюду на любом языке. Func (x, y) может проходить в разных параметрах. На некоторых языках, таких как PHP, Java, такого рода вызов достаточно, чтобы решить все проблемы. Но JavaScript - это функциональный язык, и концепция закрытия и странное ключевое слово, которое определяет недостатки этого способа призывания. Это следует интерпретировать как объем текущего сегмента кода, который будет изменяться по мере того, как код выполняется в разные фрагменты. Однако в некоторых случаях мы не хотим, чтобы это было изменено, например, события, связанные с определенными DOMS. Мы определенно не хотим, чтобы это было перенесено в окно, когда они вызываются, но иногда это так, например, следующий код.
Кода -копия выглядит следующим образом:
var a = {};
var func = function (x) {
console.log (это);
};
a.onclick = function () {
var x = 100;
func (x);
};
a.onclick ();
Вы можете думать о ссылке на странице. Поскольку мы просто хотим связать определенный метод с событием OnClick, вместо того, чтобы вызывать его немедленно, и этот метод имеет параметр, нам необходимо завершить его анонимным методом и передать его в Onclick Event a. У этого есть проблема. Это в Func становится глобальным окном объекта, очевидно, мы не хотим этого. В настоящее время использование func () в качестве метода прямого вызова невозможно, поэтому нам нужно связать это вне фонда с методом func. Таким образом, есть метод привязки, применить, применить.
связывать
Цель привязки очень проста, возвращая тот же метод, который связывает этот объект. Приведенный выше код может достичь цели связывания этого на объекте, изменяя одну строку.
Кода -копия выглядит следующим образом:
var a = {};
var func = function (x) {
console.log (это);
};
a.onclick = function () {
var x = 100;
func.bind (это) (x); // связывать здесь
};
a.onclick ();
Таким образом, это событие Onclick не будет бегать, как безголовая муха.
Позвоните и примените
Звоните и применение следует говорить вместе, потому что они так похожи. Все они поддерживают несколько параметров, и первый параметр - это объект, который будет связан, а второй параметр - их разница. Call использует независимые параметры в качестве параметров вызова и применение использует массив в качестве параметров вызова. Иногда мы не хотим менять этот объект, но мы хотим искусственно связывать его с другими объектами. В настоящее время звоните и применить очень полезны. (Дело не в том, что вы не можете использовать Bind, но кажется, что Bind появляется поздно, поэтому совместимость браузера может быть плохой). Возьмите каштан:
Кода -копия выглядит следующим образом:
a = {
func: function () {
this.x += 1;
},
x: 0
};
b = {
A: A,
x: 20
};
для (var i = 0; i <10; i ++) {
bafunc ();
}
console.log (ax);
console.log (bx);
Есть X в объектах A и B выше. Мы надеемся, что Func может изменить соответствующий X целевым образом, но прямой вызов может изменить только x в сфере фанка, то есть AX. Изменить код для достижения цели изменения BX
Кода -копия выглядит следующим образом:
a = {
func: function () {
this.x += 1;
},
x: 0
};
b = {
A: A,
x: 20
};
для (var i = 0; i <10; i ++) {
bafunc.call (b); // связывать это с b
}
console.log (ax);
console.log (bx);
Этот каштан не очень хорошо принят, и это очень запутанный стиль кода, с применимыми сценариями, но не доступен везде.