【发布时间】:2015-08-09 03:15:33
【问题描述】:
在我正在构建的 Angular 应用程序中的 js 文件中,我想在顶部声明 controllers、services 等,然后在下面定义它们。
我现在有这个工作,没关系。问题是,当我开始一个新文件时,我通常会复制现有文件的内容并更改函数的名称。但是,我必须经历一大堆函数名称,这很痛苦。我宁愿简单地更改包含这些函数的对象的名称,然后只更改
oldapp.controller
到
newapp.controller
为了更好的说明,这就是我现在所拥有的
var pos__filejs_HomeApp = angular.module('ros.filejs.HomeApp', ['ui.router']);
pos_filejs_config.$inject = ['$stateProvider', '$urlRouterProvider'];
pos__filejs_HomeApp.config(pos_filejs_config);
pos_filejs_controller.$inject = ['$scope'];
pos__filejs_HomeApp.controller('ros.postjs.ctrl', pos_filejs_controller);
//----------------------------------------------------
// FUNCTIONS
//----------------------------------------------------
function pos_filejs_config($stateProvider, $urlRouterProvider){
// implementation
}
function pos_filejs_controller($scope){
//implementation
}
这是我想要的:
var pos__filejs_HomeApp = angular.module('ros.filejs.HomeApp', ['ui.router']);
HomeApp.config.$inject = ['$stateProvider', '$urlRouterProvider'];
pos__filejs_HomeApp.config(HomeApp.config);
HomeApp.controller.$inject = ['$scope'];
pos__filejs_HomeApp.controller('ros.postjs.ctrl', HomeApp.controller);
//----------------------------------------------------
// FUNCTIONS
//----------------------------------------------------
var HomeApp = {
config: function ($stateProvider, $urlRouterProvider){
// implementation
},
controller: function ($scope){
//implementation
}
}
这相当干净,尤其是当文件变得更大并且添加了更多服务、配置时。
问题是,我似乎无法将对象实现放在有角的东西下面,因为该对象没有“提升”——也就是说,文件顶部对HomeApp 的引用是undefined,因为HomeApp 仅在下方定义(function name(){...} 不是这样。
如何提升对象以便在文件的更高位置使用它?
【问题讨论】:
-
忘记“提升”这个词,它具有误导性。实际发生的是在执行任何代码之前处理变量声明(将变量初始化为undefined)。然后代码执行开始,自上而下。因此,如果您将分配“向上”移动,则只能分配“更高”的值。
-
但是如果它适用于变量,有没有办法让它适用于对象?
-
"因此,只有将赋值向上移动,才能将值向上赋值".
-
这不是真的,你可以在代码末尾指定
var abc = "abc",顶部的代码就会知道它是什么 -
@Imray——不在任何与 ECMA-262 一致的实现中。如果您考虑一下,在一般情况下“提升”作业在逻辑上是不可能的。您的困惑是我反对使用“提升”一词的主要论据,它推断整个语句被移动到执行上下文的顶部,而没有任何事情发生。
标签: javascript angularjs hoisting