Я пытаюсь погрузиться в src-код jQuery, и в самом начале кода src в версии (3.2.1) разработки jQuery мы находим:
( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
Что касается моих знаний, я знаю, что тернарный оператор приходит после некоторого условия, но здесь он возникает после оператора присваивания module.exports = global.document?
, Не могли бы вы объяснить это? Что он делает в контексте предыдущего кода?
Тернарный оператор позволяет условно оценить два выражения (первое в случае условия истинно, второе - в противном случае).
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
Назначение означает, что результат условной оценки присваивается module.export
.
Тернарный оператор является синтаксическим сахаром и работает следующим образом:
function ternary_operator(condition, expression1, expression2) {
if (condition) {
return expression1;
} else {
return expression2;
}
}
поэтому вы можете перевести код на:
module.exports = ternary_operator(global.document,
factory( global, true ),
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
});
Пожалуйста, обратите внимание на:
factory( global, true )
а также
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
Это оба выражения: результатом активации factory
функции является выражение; определение значения функции также является выражением.
Функция ternary_operator
предоставляет нетерпеливый тернарный оператор. Выражения оцениваются внутри условия, а затем возвращается один из них. Например:
var l = ternary_operator(C, A, B);
1. evaluate C
2. evaluate A
3. evaluate B
4. activate function ternary_operator
5. assign to l the result of the function
Терминальный оператор Javascript ленив: это означает, что условие сначала оценивается, затем оценивается только одно из другого выражения, получая с точки зрения производительности.
var l = C ? A : B;
1. evaluate C
2.1 if C is true evaluate A
2.2 if C is false evalutate B
3. assign to l the expression evaluated
a=b?c:d;
В этом случае тернарный оператор не проверяет a = b, а скорее на b. Это связано с тем, что оператор присваивания имеет более высокую предрасположенность оператора, чем троичный оператор, по уважительной причине.
(a=b)?c:d;
В этом случае тройной оператор действительно проверяет a = b. В этом случае он сохранит b в и вернет это значение.