Неоднозначный звонок? функции и объекты JavaScript

Я вижу, что в jQuery, чтобы быть конкретным

var a= 'something' || function () {

}

или же

var a = 'something' || { }

Что это значит? Я знаю, что { } - это объект json в javascript, и я знаю об анонимных функциях в javascript, но все еще не могу понять, что это значит.

Спасибо за помощь заранее.

4 ответа

Решение

Вы, скорее всего, включили ошибочный пример. Ваш код верен, но писать его было бы бесполезно, поскольку вы присваиваете переменную известную строку, которая отображает следующее OR Заявление бесполезно.

Что является общим, так это синтаксис:

function foo(bar) {
   // set baz to the contents of bar
   // or create an empty object if bar evaluates to false
    var baz = bar || {}; 
}

Такого рода "условное присваивание" является распространенной идиомой в языках, которая использует преимущество короткого замыкания логических операторов (в данном случае, например, "ИЛИ") для присвоения переменной значения левого выражения, если оно вычисляется как "истинное" значение или правое выражение, если нет. Рассматривать:

var nullOrFive = null || 5; // => 5

Левая сторона (null || five) оценивает слева направо тестирование каждого операнда оператору OR, пока не найдет "правдивый", возвращая его. С другой стороны:

var tenOrWhatever = 10 || someMethodThatIsNeverCalled(); // => 10

Таким образом, в ваших примерах, если "что-то" имеет значение true (что-то кроме "undefined", "null" и ноль в JavaScript), тогда переменная "a" получит свое значение, в противном случае она получит функцию (function() {...}) или объектный литерал ({}).

При присваивании значения переменной JavaScript оценивает данное выражение.

var s= s || {};

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

File1

var globalNamespace = globalNamespace  || {};
globalNamespace.someVariable  = "some value;"

File2

var globalNamespace = globalNamespace  || {};
globalNamespace.someFunction = function()
{
    return this.someVariable;
};

Таким образом, можно расширить объект globalNamespace, не беспокоясь о том, что код разбит на несколько файлов.

Цитирование документации по MDC,

Logical OR (||)
expr1 || expr2
Returns expr1 if it can be converted to true; otherwise, returns expr2.
Thus, when used with Boolean values, || returns true if either operand is true;
if both are false, returns false.

Кроме того, существует оценка короткого замыкания: поскольку логические выражения оцениваются слева направо, они проверяются на возможную оценку "короткого замыкания" с использованием следующих правил

поэтому, если expr1 может быть оценено как true, expr2 не оценивается.

jQuery использует многие из этих оценок короткого замыкания, чтобы определить значения по умолчанию для переменных. например. var o = options || {}; поместит параметры в переменную o; но удостоверится, что o инициализирован как {}, если опции не определены или не определены

Другие вопросы по тегам