Javascript 为什么我们需要包装纸?

Javascript 为什么我们需要包装纸?,javascript,angularjs,Javascript,Angularjs,关于Angular有一件事我还是不明白。。。 既然我可以使用window全局对象并得到相同的结果,为什么还要使用$window呢?既然我可以使用setTimeout,为什么还要使用$timeout呢 我有时会使用本机javascript代码,它工作得很好,那么为什么AngularJS首先创建了这些包装器?它集成到摘要循环中(将触发HTML编译器和DOM刷新)。还使代码更易于测试,因为您可以模拟$timeout对象并测试它是否被调用 例如,使用$timeout,您可以在单元测试中调用$timeou

关于Angular有一件事我还是不明白。。。 既然我可以使用window全局对象并得到相同的结果,为什么还要使用$window呢?既然我可以使用setTimeout,为什么还要使用$timeout呢


我有时会使用本机javascript代码,它工作得很好,那么为什么AngularJS首先创建了这些包装器?

它集成到摘要循环中(将触发HTML编译器和DOM刷新)。还使代码更易于测试,因为您可以模拟$timeout对象并测试它是否被调用

例如,使用$timeout,您可以在单元测试中调用$timeout.flush(),它的作用就像超时等待了适当的时间并触发回调一样。这使您的测试运行得更快,这对TDD也有好处

下面是一个简单的异步示例-假设asyncThing.method()使用$timeout和$log输出消息

    describe('Async test', function () {
        var asyncThing, $timeout, $log;
        beforeEach(module('async'));
        beforeEach(inject(function (_asyncThing_, _$timeout_, _$log_) {
            asyncThing = _asyncThing_;
            $timeout = _$timeout_;
            $log = _$log_;
       }));
       it('should do some async stuff', function () {
           asyncThing.method(some_arguments);
           $timeout.flush();
           expect($log.info.logs).toContain(['Some output']);
       });
   });

“对浏览器窗口对象的引用。虽然窗口在JavaScript中是全局可用的,但它会导致可测试性问题,因为它是一个全局变量。在angular中,我们总是通过$window服务引用它,因此它可能会被覆盖、删除或模拟以进行测试。”,