AngularJs&Javascript嵌套函数&他们的调用

AngularJs & Javascript nested functions & their invocation

本文关键字:amp 他们的 调用 函数 Javascript AngularJs 嵌套      更新时间:2023-11-26

考虑以下代码

<body ng-app="myApp">
  <h1>Hello {{name}}</h1>
  <h2>reverse of your name is {{ name | reverse }}</h2>
  <input type="text" ng-model="name">
  <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.js'></script>
  <script>
  angular.module('myApp', [])
    .filter('reverse', function(){
      return function(str){
        return str.split('').reverse().join('');
      }
    });
  </script>
</body>

这里感兴趣的比特是reverse滤波器。我认为它在做什么:

  1. 使用两个参数调用CCD_ 2。CCD_ 3g&arg2: function(准确地说是匿名或无名称函数)
  2. arg2函数不接受参数,而是在其中嵌套了另一个匿名函数
  3. 这个嵌套的匿名函数只接受一个参数,即应用此筛选器的文本或字符串
  4. 这个嵌套的匿名函数获取字符串,并将其反转

Q1.我的理解正确吗?

Q2:正常版本:

angular.filter('reverse', function(str){
  return str.split('').reverse().join('');
});

嵌套版本:

angular.filter('reverse', function(str){
      return function(str){
        return str.split('').reverse().join('');
      }
    });

Q3.为什么额外级别的函数嵌套是有用的&在什么情况下我会直接返回值。或者返回一个函数,然后返回实际结果?

Q4.这对范围有何影响?闭包在这里有什么作用吗?

JSFiddle:http://jsfiddle.net/C7EDv/

(Q1.1)右-两个参数,一个带过滤器名称的字符串和。。。

(Q2/3)filter(arg2)的第二个参数是构造函数(或"工厂")函数。它只在创建过滤器时执行一次。

构造函数必须返回一个函数。返回的函数将在使用与其关联的筛选器时执行。换句话说,返回的函数就是注入(使用$injector)到过滤器中的函数(http://docs.angularjs.org/api/ng.$filterProvider)

我在下面添加了详细的评论:

angular.filter('reverse', function(service){
      // This is run only once- upon creation
      return function(str){
        // This is run every time the filter is called
        return str.split('').reverse().join('');
      }
});

(Q3)您将始终使用此表单("嵌套表单"),否则会出现错误Object ... has no method 'apply'),因为Angular需要返回一个函数,无论何时使用过滤器,它都可以调用该函数(使用apply())。这与Angular中的所有提供者(包括服务)完全一样。

(Q2)如果可以执行您所称的"正常版本",那么过滤器在创建时只会运行一次。它得到的任何返回值都将用于过滤器的每次调用。由于拥有一个总是返回相同值的过滤器并不是很有用,Angular通常会使用这种javascript构造函数模式(您将在JS的其他地方看到它的使用),因此每次使用过滤器都会导致对相关函数的新调用。

(Q1.4)是的,返回的函数确实反转了字符串。这是一个关于这个滤镜的2分钟视频:http://www.thinkster.io/pick/EnA7rkqH82/angularjs-filters

(Q1.2/3)如果你的过滤器使用任何服务,你会把它们传递到我上面使用service的地方(上面的链接有一个例子)。参数str是过滤器的输入,正如您所指出的。

(Q4)"运行一次"区域确实创建了一个闭包,因此您可以像使用其他闭包一样使用它。