我试图深入研究jQuery的src代码,并且在jQuery的开发版本(3.2.1)中的src代码的最开始,我们发现:
( 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 ?
之后。你能解释一下吗?它在上一个代码的上下文中做了什么?
答案 0 :(得分:4)
三元运算符允许有条件地计算两个表达式(条件为真时为第一个,否则为第二个)。
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
答案 1 :(得分:1)
a=b?c:d;
在这种情况下,三元运算符不检查 a = b ,而是检查 b 。这是因为赋值运算符比三元运算符具有更高的运算符前提,这是有充分理由的。
(a=b)?c:d;
在这种情况下,三元运算符确实测试 a = b 。在这种情况下,它会将b存储在a中并返回该值。