为什么angular中config要传入一个数组作为参数,而不是传两个参数

Javascript中让初学者迷惑不解的,其实是它的对象数据类型。在JavaScript中的对象是引用类型,这也就是说把对象赋值给一个变量,仅仅表示这个变量拥有了指向对象内容所在内存的指针值,而非对象内容本身,因此当把对象内容的其中一个属性赋值给另外一个变量时,可以利用这个变量做更加高性能的操作。

这和今天的主题没有直接的联系,但是是作为初学者理解JavaScript时必须掌握的一个点。

在angular里面,config的用法如下:

angular.module("myApp", [])
  .config(["$routerProvider", $routerProvider => {
    // ...
  }])

这个用法很奇怪,为什么要把一个数组当做参数传给config呢,特别是当数组的元素数据类型不同,第二个元素还是函数,就显得非常让人意外,为什么不直接传两个参数,第一个参数是个字符串,第二个参数是函数,这不是非常容易理解吗?

但是在$routeProvider的when中,resolve.data的值也是一个类似的数组:

resolve: {
  data: ["$http", $http => {}]
}

如果函数的参数可以改为两个参数的话,这里则不可能实现。

由于JavaScript数据类型的特质,没有Python里面的元组的概念。使用data: ("$http", $http => {})这种形式会出现错误。使用数组,是JavaScript里面的唯一的替代方案。

不过从可读性的替代方案方面考虑,使用对象可能会更有利于阅读,比如我们可以这样假设:

resolve: {
  data: {
    key: "$http",
    callback: $http => {},
  }
}

不过这样在书写上会比较费劲,而且增加了代码量,更不利于参数作为中间值传递。使用数组的好处是除了可以在一行内写完需要的元素外,还可以用于apply。一旦非常明确规定数组元素的个数,或者像参数个数一样对个数进行判别,那么跟参数个数一样也具有严肃性。

但用于apply这点,使用数组有天然的优越性。比如当你打算使用一个数组作为参数时,可以直接:

func.apply(this, args)

这样无需对接收到的数据做任何处理,就可以对该数据进行过滤等操作。

不过如果使用ES5的话,这个问题比较容易解决:

func(...arguments)

有这样的操作,就不需要传入一个数组。但是这仍然无法解释如何给data赋值的问题。

另外就是要看,这个数组的第一个元素是一个key值,是字符串,但是它其实对应的是全局某一个变量的key,也就是angular.$routerProvider这种形式的数据,它可以用angular["$routerProvider"]来表示,而它一般就是一个函数,在这个函数中会去回调原来数组中的第二个元素,也就是带有$routerProvider的函数。这种设计,巧妙的运用了JavaScript的特性,同时又使得程序具有较大的灵活性。

2017-01-20 |