Javascript init()和window.init()之间有什么区别?
我已经阅读了以下配方,其中展示了一种使用Google Cloud Endpoints后端为AngularJS前端供电的方法: 我不明白的是关于AngularJS和Cloud端点初始化的附录。相关章节如下: 附录:AngularJS+云端点初始化提示#1: 注意初始化顺序 guestbook应用程序加载以下三个不同的JS库 顺序:Javascript init()和window.init()之间有什么区别?,javascript,angularjs,google-cloud-endpoints,Javascript,Angularjs,Google Cloud Endpoints,我已经阅读了以下配方,其中展示了一种使用Google Cloud Endpoints后端为AngularJS前端供电的方法: 我不明白的是关于AngularJS和Cloud端点初始化的附录。相关章节如下: 附录:AngularJS+云端点初始化提示#1: 注意初始化顺序 guestbook应用程序加载以下三个不同的JS库 顺序: 安格拉斯 留言簿应用程序 Google API客户端,其中包含端点功能 要遵循此顺序,index.html包含以下内容 标签中用于加载每个JS库的标签: <
- 安格拉斯
- 留言簿应用程序
- Google API客户端,其中包含端点功能
标签中用于加载每个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>
此init()函数在guestbook.js中的定义方式如下:
function init() { window.init(); }
正如上面的代码所示,该函数只调用window.init()
函数(即全局窗口对象中定义的init()函数)
除此之外什么也不做。init()是在AngularJS中定义的
控制器如下:
$window.init= function() {
$scope.$apply($scope.load_guestbook_lib);
};
在AngularJS中,全局窗口对象由“$window”访问
它的包装符号。这是AngularJS的最佳实践
不直接访问窗口对象以提高可测试性
不希望在中执行初始化的原因
第一个init()方法是,这样您就可以放置尽可能多的代码
在AngularJS世界中,例如控制器、服务和指令。
因此,您可以充分利用AngularJS的强大功能并拥有所有功能
您的单元测试、集成测试等等
似乎在外部javascript文件中定义了一个全局函数
init()
。这个init()
函数只调用window.init()。但是window.init()不是只有全局定义的init()函数吗?因此,在重新定义window.init()
(因此init()
)之前,我们不会在这里得到一个循环吗?guestbook.js定义了一个从您的描述中显示为全局的init函数。该init函数被传递到google client.js。该全局init函数只调用window.init上的(另一个)全局函数。首先加载的angular模块应通过angular提供的$window具有setup window.init。没有循环,client.js调用guestbook.js的init,它调用角度方法$window.init,与window.init相同。此示例尝试获取google api init事件并将其传输到AngularJS范围
什么时候
它调用全局定义的init函数,该函数反过来调用在窗口对象上定义的init方法。
由于此函数可以访问角度范围,因此它可以很好地处理角度范围
它使得在承诺中封装云端点调用变得更容易
下面是如何使它更容易
请不要依赖场外资源。显示您正在谈论的代码。非现场资源会腐烂,人们不必访问它们来帮助您。我不太明白:全局定义的函数显示为全局对象(即窗口)上的属性。那么怎么可能有两个不同的函数init和window.init呢?(据我所知,guestbook.js会覆盖角度定义的版本,反之亦然。)全局定义的init函数是在窗口对象上定义的init方法。所以我不明白为什么代码不会循环。
$window.init= function() {
$scope.$apply($scope.load_guestbook_lib);
};
<script src="https://apis.google.com/js/client.js?onload=init"></script>