AngularJs&Javascript嵌套函数&他们的调用
AngularJs & Javascript nested functions & their invocation
考虑以下代码
<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
滤波器。我认为它在做什么:
- 使用两个参数调用CCD_ 2。CCD_ 3g&
arg2: function
(准确地说是匿名或无名称函数) - arg2函数不接受参数,而是在其中嵌套了另一个匿名函数
- 这个嵌套的匿名函数只接受一个参数,即应用此筛选器的文本或字符串
- 这个嵌套的匿名函数获取字符串,并将其反转
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)"运行一次"区域确实创建了一个闭包,因此您可以像使用其他闭包一样使用它。
- 将Adobe创意编辑的图像上传到我的服务器,而不是他们的创意云
- ckeditor,并在用户键入时显示他们的数据
- Codecademy代码在他们的网站上连接到Youtube API,但赢得了't在本地运行
- AngularJs&Javascript嵌套函数&他们的调用
- 潜水者不适合放在他们的容器里,他们增加了像素
- 如何将相应的表头 (th) 复制到他们的表单元格 (td)
- 其他人可以在他们的 Node.js REPL 中使用 let 语句吗?
- 37signals如何在他们的主页上改变这一天
- 浏览器供应商是否针对jQuery优化了他们的浏览器
- 为什么人们添加他们的JavaScript代码
- 如何使用他们的文件夹上传文件
- 循环这个.props.children我如何测试他们的类型
- 如何将现有 ul 的所有 li 添加到另一个 ul 的底部,基于他们的 css 类
- instaEarth是如何在他们的首页上创建地图的
- 导出高图表气泡纬度/纬度图通过他们的服务器
- SoundCloud和Vimeo在不同的标签中同步他们的播放器(有时也同步标签和嵌入式播放器)
- 从 jquerymobile.com 下载与他们的演示不同
- 希望在注册后将用户定向到他们的帐户
- 人们如何在不透露他们的谷歌API密钥的情况下将所有这些很酷的谷歌地图示例放在jsFiddle上
- 当您在iPhone上访问他们的网站时,预测io使用什么框架来“下载”应用程序