2014-02-04 3 views
0

Что делает строка 'undefined' != typeof Customer ? Customer : module.exports в следующем фрагменте кода? И почему вы обертываете все в пределах (function(){})? Я не могу расшифровать его значениеNodejs module.exports и Shorthand if/else

Этот фрагмент происходит из файла библиотеки.

(function (Customer) { 

    Customer.Base = { 
    //... 
    } 

})(
    'undefined' != typeof Customer ? Customer : module.exports 

); 

ответ

1

Это тройной, который используется для определения того, что передается функции. Функция - это выражение с немедленным вызовом функции (IIFE) - функция, которая создается и сразу же вызывается.

//the condition 
'undefined' != typeof Customer 
//true value 
? Customer 
//false value 
: module.exports 

Если Customer не определен, это тот же самый результат:

(function (Customer) { 

    Customer.Base = { 
    //... 
    } 

})(module.exports); 

Так что этот блок кода создает и сразу же вызывают функцию, которая делает что-то к Customer. Если задано Customer, то функция Customer передается функции как аргумент функции, который также называется Customer. Если Customer не определено, module.exports передается функции как аргумент Customer. Этот код можно переписать в виде:

var param; 
if ('undefined' != typeof Customer) { 
    param = Customer; 
} else { 
    param = module.exports; 
} 

function myFunc(Customer) { 

    Customer.Base = { 
    //... 
    } 

} 

myFunc(param); 

Это может быть легче понять в более общем примере.

Вот IIFE, функция, которая создается и сразу же вызывается: Live demo (click).

(function(param) { 
    console.log(param); 
})('some param!'); 

и вот та же самая функция, с помощью тройной для определения значения пар: Live demo (click).

var x = true; 
//var x = false; 

var value = x ? 'true value!' : 'false value!'; 

(function(param) { 
    console.log(param); 
})(value); 

Измените x (условие) на true или false и убедитесь, что присвоенное значение value соответственно изменяется.

Вы часто можете увидеть тройное состояние, завернутое в (), но они не нужны:

('undefined' != typeof Customer) ? Customer : module.exports 

Кроме того, более типично, чтобы видеть, что оператор спросил противоположный путь:

typeof Customer === 'undefined' 

и вполне вероятно, что достаточно простой проверки равенства прав на «правдоподобие» здесь:

Customer ? Customer : module.exports 

и что может снова быть упрощена:

Customer || module.exports 
//if "Customer" is truthy, it will be used, otherwise, module.exports is used 

Также отметим, что с IIFE, то может быть })() или {()), причем последний является более типичным синтаксиса.

Смежные вопросы