2017-02-12 4 views
2

В You don't know JS type & grammar в конце главы 1 показан шаблон проектирования, называемый «инъекцией зависимостей», который, как я знаю, не является точкой этой главы, но я был смущен примером.Дизайн-шаблон в javascript

пример кода здесь:

function doSomethingCool(FeatureXYZ) { 
 
    var helper = FeatureXYZ || 
 
     function() { /*.. default feature ..*/ }; 
 

 
    var val = helper(); 
 
    // .. 
 
}

Так что я хочу, чтобы использовать эту функцию.

Поскольку я не знаю, существует ли FeatureXYZ, я не знаю, как его использовать. doSomethingCool() не будет использовать FeatureXYZ, а doSomethingCool (FeatureXYZ) выдаст ошибку, если не существует FeatureXYZ. Таким образом, функция может быть бессмысленной функцией.

ответ

0

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

Используйте скобку для обозначения объекта "FeatureXYZ" либо на объекте window, либо на объекте, в котором должно быть указано "FeatureXYZ". Обозначение скобок не должно вызывать ошибку, если свойство не определено на объекте.

function FeatureXYZ() { 
 
    return {def:456} 
 
} 
 

 
function doSomethingCool(FeatureXYZ = window["FeatureXYZ"] /* obj["FeatureXYZ"] */) { 
 
    var helper = FeatureXYZ || function config() { 
 
    /*.. default feature ..*/ 
 
    return {abc:123} 
 
    }; 
 
    var val = helper(); 
 
    // .. 
 
    return val 
 
} 
 

 
console.log(doSomethingCool());

+0

может быть решением, но в моем случае использует ли dosomethingcool пера по умолчанию или featherxyz полностью должен зависеть от внешней стороны окружающей среды, а не функция пути была call.As мы не знаем, функциональность featherxyz, мы не можем использовать способ параметров по умолчанию (предположим, что мы загружаем файлы с файлами в наш проект и даже не знаем, выходит ли функцияxyxyz) – teek

+0

Что ожидает результат, если 'FeatureXYZ' не существует? Должна ли быть вызвана функция по умолчанию или нет функции?То есть, какова логика, которую вы реализуете в отношении существования или отсутствия «FeatureXYZ»? – guest271314

+0

функция по умолчанию, которая записывается внутри функции dosomethingcool. только featherxyz существует во внешней стороне функции dosomething, функция по умолчанию будет удалена. – teek

0

В принципе, оператор || возвращает первое значение, если оно не является нулевым или неопределенным. Если это так, он возвращает второе значение. Пример:

var x = null; 
var y = x || 5; 

x имеет нулевое значение, следовательно, z будет установлен равным 5. Если x будет, например, 4, y, будет установлено также 4.

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

function(x, y) { 
    return x * (y || 5); 
} 

Это не приведет к ошибке при вызове функции без прохождения y, потому что это было бы умножить x на 5 если y не предусмотрено (и, следовательно, не определено) ,

Вот как работает пример: он устанавливает helper равным FeatureXYZ или, если он не передан в качестве аргумента, например. doSomethingCool() (и поэтому не определено), он установлен на функцию по умолчанию. Таким образом, в конце кода, когда вы выполняете helper(), вы либо используете переданную функцию, либо по умолчанию, если она не указана.