init()和window.init()之间有什么区别?

Mar*_*arc 6 javascript angularjs google-cloud-endpoints

我已经阅读了以下配方,其中显示了使用Google Cloud Endpoints后端为AngularJS前端提供支持的方法:

https://cloud.google.com/resources/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications

我不明白的是AngularJS和Cloud Endpoints初始化的附录.相关部分如下:

附录:关于AngularJS + Cloud端点初始化的提示提示#1:注意初始化序列

留言簿应用程序按以下顺序加载三个不同的JS库:

  • AngularJS
  • 留言簿应用程序
  • Google API客户端,包含端点功能

为了遵循这个顺序,index.html在<script>标记中包含以下 标记,<head>用于加载每个JS库:

<script src="js/angular.min.js"></script>  
<script src="js/guestbook.js"></script>  
<script src="https://apis.google.com/js/client.js?onload=init"></script>
Run Code Online (Sandbox Code Playgroud)

加载后,第三个库(Google API客户端)调用其"onload"参数指定的初始化函数.在这种情况下,期望并调用init()函数.提示#2:尽快进入AngularJS世界

在初始化序列中,我们使用两个函数:

init() function
window.init() function
Run Code Online (Sandbox Code Playgroud)

这个init()函数在guestbook.js中以下列方式定义:

function init() {   window.init(); }
Run Code Online (Sandbox Code Playgroud)

正如您可以看到上面的代码,该函数只调用window.init()函数(即在全局窗口对象中定义的init()函数)而不执行任何其他操作.window.init()在AngularJS控制器中定义如下:

$window.init= function() {   
   $scope.$apply($scope.load_guestbook_lib);
};
Run Code Online (Sandbox Code Playgroud)

在AngularJS中,全局窗口对象由"$ window"表示法访问,该表示法是它的包装器.AngularJS中的最佳实践是不直接访问窗口对象以提高可测试性.

您不希望在第一个init()方法中执行初始化的原因是您可以在AngularJS世界中放置尽可能多的代码,例如控制器,服务和指令.因此,您可以利用AngularJS的全部功能并进行所有单元测试,集成测试等.

似乎init()在外部javascript文件中定义了一个全局函数.这个init()函数只是调用window.init()(并且应该在加载后由Google客户端库调用).但是window.init()不是全局定义的init()函数吗?所以我们不会在这里得到一个循环,直到window.init()(并因此init())被重新定义?

aet*_*aet 0

guestbook.js 定义了一个 init 函数,从您的描述来看,该函数是全局的。该 init 函数被传递给 google client.js。该全局 init 函数只是在 window.init 处调用(另一个)全局函数。首先加载的 Angular 模块应该通过 Angular 提供的 $window 设置 window.init。没有循环,client.js 调用 guestbook.js 的 init,后者调用角度方法 $window.init,这与 window.init 相同。