为什么angularjs ui路由器不使用常规javascript语法

为什么angularjs ui路由器不使用常规javascript语法,javascript,angularjs,angular-ui-router,code-injection,Javascript,Angularjs,Angular Ui Router,Code Injection,更新 我是angularjs ui路由器javascript框架的新手,不过我下载了示例联系人应用程序 描述用户界面路由器。 根据此示例,您可以为如下状态定义控制器: controller: ['$scope', '$state', 'contacts', 'utils', function ( $scope, $state, contacts, utils) { //blablablab }] 在此之前,我从未见过这种形式的javascrip

更新

我是angularjs ui路由器javascript框架的新手,不过我下载了示例联系人应用程序 描述用户界面路由器。 根据此示例,您可以为如下状态定义控制器:

  controller: ['$scope', '$state', 'contacts', 'utils',
    function (  $scope,   $state,   contacts,   utils) {
       //blablablab 
    }]
在此之前,我从未见过这种形式的javascript对象定义。您可以看到控制器是一个字符串数组加上一个函数

我的问题是:

通常的javascript解释器如何解释这段代码

    angular.module('uiRouterSample.contacts', [
      'ui.router'
    ]).config(
  [          '$stateProvider', '$urlRouterProvider',
    function ($stateProvider,   $urlRouterProvider) {
      $stateProvider

        .state('contacts', {

          abstract: true,

          url: '/contacts',

          templateUrl: 'app/contacts/contacts.html',

          controller: ['$scope', '$state', 'contacts', 'utils',
            function (  $scope,   $state,   contacts,   utils) {
               //blablablab 
            }]
        })


    }
  ]
);

[]中的参数是代码所需的依赖项。如果不注入依赖项,则无法访问它们。例如,$scope

AngularJS在创建控制器、服务、工厂或任何可注入内容(如普通javascript方式)时,会进行某种函数检查,以猜测参数名称:

function($scope, $http, otherService) {
    //bla bla bla
}
当这个函数即将被注入它们的参数时,注入该函数的值将从AngularJS的内部注册表中按函数参数名获取。这意味着将搜索注册为“$scope”的对象、注册为“$http”的对象和注册为“otherService”的对象,并将其传递给函数

您可以重写此行为,并在您希望框架在参数中注入的可注入内容上显式。其中之一是:为这样的函数提供$inject属性毕竟,函数是一个对象,具有要注入的内容的准确名称:

var f = function(itDoesNotMatter, anymore, whichArgumentsNamesDoIUse) {
    //bla bla bla
}
f.$inject = ['$scope', '$http', 'otherService'];

//blablabla

$stateProvider.state({
    //...
    controller: f
})
最后,与使用$inject类似的一步解决方案的结果是等效的:

...
controller: ['$scope', '$http', 'otherService', function(x, y, z) {
    //bla bla bla
}]

是的,您的数组有N+1个元素。最后一个是要填充的N-arity函数,而前面的元素是strings=要注入的服务的名称。

Java不是JavaScript。它将继续像以前一样工作,直到您缩小它。假设你也删除了结尾]阅读AngularJS文档。但你不能简单地来这里要求一些东西而不显示你的搜索结果,人们往往认为你没有在这方面付出任何努力。如果你真的尝试了什么,请把它添加到你的问题中,否则这篇文章将被否决,可能会被投票关闭。