javascript - AngularJs 和 Javascript 嵌套函数及其调用

标签 javascript angularjs

考虑以下代码

<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. 用两个参数调用 angular.filter()arg1: string & 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) 的第二个参数是构造函数(或“工厂”)函数。它仅在创建过滤器时执行一次。

构造函数必须返回一个函数。当使用与其关联的过滤器时,将执行返回的函数。换句话说,返回的函数是注入(inject)(使用 $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)“运行一次”区域确实创建了一个闭包 - 因此您可以像使用任何其他闭包一样使用它。

关于javascript - AngularJs 和 Javascript 嵌套函数及其调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254146/

相关文章:

javascript - 在标记簇组中搜索标记 Leaflet-MarkerCluster

javascript - 单击按钮时如何在文本后面获取图像

javascript - $http 是否对 params 对象进行排序?

css - AngularJs 日历在 IE 中的宽度减小

json - Angularjs 在 ng-repeat 中将字符串转换为对象

javascript - 在调用 sendToDevice 之前,将 Promise.All 与 Firebase Cloud Fxs 结合使用,用 FCM token 填充数组

javascript - 无法使用 Greasemonkey 单击此超链接

php - 使用 angularjs 保存多个复选框值数据库

javascript - Protractor js测试无法提交 Angular 形式

javascript - 如何从字典中提取项目