JavaScript函数中的相邻圆括号是如何工作的,这在哪里有记录
How do adjacent parentheses in JavaScript functions work, and where is this documented?
在将其标记为重复之前,请注意:我理解IIFE是什么。这个问题与IIFE无关。
问题是:为什么JavaScript能够解析相邻的括号,即使在标准函数调用中也是如此?这个构造myFunction()()
-是如何工作的?例如,这里有一段使用Jasmine进行测试的代码:
var element = compile('<div my-directive></div>')(scope);
为什么我们要走这条路,而不是把范围作为第二个论点?我不认为这和保持全球环境清洁有任何关系,我在任何地方都找不到关于这个特殊结构的任何东西,除非它涉及IIFE。这个构造有名字吗?
最重要的是,请提供某种权威参考(链接到mdn、ecmascript规范等)。
这是两个规则的结果:
-
函数调用的返回值可以立即使用(无需分配给变量)。
-
函数是对象(它们可以被分配给变量,作为参数传递,并从函数调用中返回)。
第一条规则意味着,如果你有这样的代码:
function a () { return { hello : 'world' } }
你可以这样做:
a().hello; // returns 'world';
这与在不使用任何临时变量的情况下进行此操作基本相同:
var tmp = a();
tmp.hello; // value is 'world';
第二条规则意味着你可以这样做:
function b () { return function () { alert('hello world') } }
var c = b();
c(); // alerts 'hello world';
组合规则1和规则2意味着以上内容可以重写为:
b()(); // alerts 'hello world';
这一切都与闭包有关。实际情况是compile()
必须返回一个接受变量的函数,在本例中为scope
。
让我们看一个更简单的例子:
function adder (first) {
return function (second) {
return first + second;
};
};
adder(2)(3);
// returns 5
var add2 = adder(2);
// add2 now equals function (second) { return 2 + second; }
add2(4);
// returns 6
通常,这样做的一个原因是,您希望以多种方式重用一个函数。在compile
的情况下,您可以运行compile一次,并将其与许多不同的对象(或作用域)一起重用。此外,你可以用它做一些变化。
即,上面的例子可以是adder3
、adder4
等。
编译可能有这样的行为:
function compile(html) {
// Some code here to turn string template into something more useable
return function (scope) {
// Scope being an object with values to plug into a template
return DOM_element;
}
}
compile('<div my-directive></div>')
必须返回具有scope
参数的函数。
也许它看起来像这样:
function compile(stringArg){
return function(scopeArg){
if(typeof scopeArg === 'object'){
console.log(stringArg);
}
}
}
相关文章:
- 在哪里使用名为“;冻结”;
- Ember.js-接口状态应该存储在哪里
- 在Redux中,我应该在哪里编写复杂的异步流
- 在哪里可以学习ECMAScript标准中尚未包含的JavaScript功能
- 在哪里可以找到RXUI Javascript'时间飞逝'实例
- Redux应用程序结构-在哪里放置服务/业务逻辑
- 在哪里可以找到'项目'在plothover函数中
- Javascript-在哪里放置常量,全局或本地
- Sequelize:这些方法应该驻留在哪里
- AJAX更新面板不;t工作.请帮我找出我错在哪里.
- Redux - 繁重的工作应该在哪里发生 - 化简器,动作,容器或表示组件
- 我在哪里放置此JS代码以使其工作
- 我在哪里可以找到 socket.io 1.0的工作示例
- 在哪里放置这段JavaScript代码才能正常工作
- JavaScript函数中的相邻圆括号是如何工作的,这在哪里有记录
- 我应该在哪里添加JS事件,使我的链接工作
- 两个代码块单独工作,而不是一起工作,我在哪里出错了
- $.browser.msie 在 jQuery 1.9 中不再工作.替代品在哪里
- 我在哪里错在这个php代码,而选择选项工作
- 在哪里可以找到一些关于新的canvas HTML元素如何工作的好信息