Назначение синтаксиса var a = b.c = function () {} - PullRequest
5 голосов
/ 15 января 2012

Я недавно просмотрел код js, и следующий синтаксис продолжает появляться:

var foo = bar.bi = function() {...}

Это незнакомый мне синтаксис. Разве только для определения двух имен для одной и той же функции? Если так, то почему бы не определить его как bar.bi = function()?

Ответы [ 5 ]

6 голосов
/ 15 января 2012

Присваивает одно и то же значение переменной и свойству bi объекта bar одновременно.

Таким образом, свойство объекта получает значение, но вы все равно можете ссылаться на него какпеременная, которая, вероятно, немного быстрее.

Эффективно так же, как ...

bar.bi = function() {...};
var foo = bar.bi;

foo === bar.bi; // true

Или вы можете визуализировать это как ...

var foo = ( bar.bi = function() {...} );

Итак, присвоение bar.bi происходит первым.Результат, возвращаемый из выражения присваивания, является той же функцией, и этот результат присваивается foo.

1 голос
/ 15 января 2012

Это просто составное присваивание

var r = x = 3;

присваивает 3 x, а также r, что недавно объявлено.

Ваш пример просто заменяет функцию вместо 3, исвойство объекта - bar.bi - вместо x.

1 голос
/ 15 января 2012

В дополнение к назначению функции для переменной 2, контекст также изменяется в зависимости от того, как вы ее вызываете.

bar.bi();

будет иметь свой контекст как объект bar, как если бы вы использовалиthis:

foo.call(bar);

Но используя его вне другой переменной, например:

foo();

будет использовать контекст foo.Поэтому, если foo находится в глобальном контексте, это будет эквивалентно следующему:

bar.bi.call(window);
0 голосов
/ 15 января 2012
var foo = bar.bi = function() {...};



bar.bi === function() {...} //true

foo === bar.bi //true

bar будет объектом, который реагирует на метод bi.

0 голосов
/ 15 января 2012

Зависит от того, где он используется.

И foo, и bar.bi указывают здесь на одну и ту же функцию.Это означает, что функцию можно вызвать, используя

foo();

и

bar.bi();

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

foo.call(bar);  

или

foo.apply(bar);

Это гарантирует, что this будет указывать на bar внутрифункция.

пожалуйста, обратитесь:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...