javascript中的设计模式

时间:2017-02-12 16:22:21

标签: javascript dependency-injection

You don't know JS type & grammar中,设计模式称为"依赖注入"在第1章的末尾显示,我知道这不是本章的重点,但我对这个例子感到困惑。

示例代码在这里:



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

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




所以我想使用这个功能。

因为我不知道FeatureXYZ是否存在,所以我不知道如何使用它。 如果不存在FeatureXYZ,doSomethingCool()将不使用FeatureXYZ和doSomethingCool(FeatureXYZ)将抛出错误。因此,该功能可能是无意义的功能。

2 个答案:

答案 0 :(得分:0)

基本上,如果||运算符不为null或未定义,则返回第一个值。如果是,则返回第二个值。例如:

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

x为空,因此z将设置为5。如果x4,则y也会设置为4

JavaScript具有功能(或奇怪,取决于查看器),您不必传递函数的每个参数。例如,如果您具有以下功能:

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

如果您在未传递y的情况下调用该函数,则不会导致错误,因为如果未提供x,它会5乘以y(因此未定义)。

这是示例的工作原理:它将helper设置为等于FeatureXYZ,或者,如果它不作为参数传递,例如doSomethingCool()(因此未定义),它被设置为默认函数。那么在代码的后面,当你执行helper()时,你要么使用传递的函数,要么使用默认的函数,如果没有给出的话。

答案 1 :(得分: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());