我问了一个关于Currying和关闭的问题.什么是关闭?它与currying有什么关系?
computer-science glossary functional-programming terminology
我看过这样写的JavaScript(它是在演示中,我手头没有实际的代码,但暗示这是正常的):
(function() {
var a = 1;
this.sayA = function() {
alert(a);
}
}).call(this);
sayA();
Run Code Online (Sandbox Code Playgroud)
我想它是一个匿名函数,因此变量a不是全局可用的.
有什么意义.call(this)呢?由于这个函数没有嵌套,this只是窗口.它与()最后的写作有何不同?
当我使用最新的(1.0)咖啡脚本时,一个简单的javascript输出看起来像这样(默认情况下):
(function() {
var a;
a = 1;
}).call(this);
Run Code Online (Sandbox Code Playgroud)
是什么.CALL(本)做,哪些是添加它的原因是什么?
在Github上查看CoffeeScript的源代码时,我注意到大多数(如果不是全部)模块定义如下:
(function() {
...
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这种模式看起来像是将整个模块包装在匿名函数中并调用自身.
这种方法的优点和缺点是什么?还有其他方法可以实现相同的目标吗?
我最近一直在研究一些JS库,这些库是由真正了解他们正在做什么的人编写的,我一直看到这种模式,而且我找不到有关它的信息.我阅读了.call()方法的文档,但它对我来说并没有多大意义.我希望通过实例获得其中一个经典的深入SO解释.
(function(undefined){
/*(insert entire library here)*/
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这是关于什么的?为什么这是编写库的好方法?
请注意,有时undefined会省略,但我不知道将它放在那里有什么不同.我甚至不知道论据的来源,或者来电者是谁.
我最近开始使用coffeescript,很好奇将我用Coffeescript创建的对象暴露给其他javascript页面的"正确"方法是什么.由于coffeescripts包装功能,是否可以接受调用行为window.coffeeObject = externalObject.
example.coffee
externalObject =
method1: -> 'Return value'
method2: -> 'Return method2'
window.myApi = externalObject
Run Code Online (Sandbox Code Playgroud)
example.js - 从example.coffee编译
(function() {
var externalObject;
externalObject = {
method1: function() {
return 'Return value';
},
method2: function() {
return 'Return method2';
}
};
window.myApi = externalObject;
}).call(this);
Run Code Online (Sandbox Code Playgroud)
other.js
alert(myApi.method1()) // Should return "Return value"
Run Code Online (Sandbox Code Playgroud) backbone.js源代码使用这样的函数包装器:
(function(){
...
}).call(this);
Run Code Online (Sandbox Code Playgroud)
如http://backbonejs.org/docs/backbone.html#section-185所示.
更常见的是,我已经看到使用以下内容:
(function(){
...
})();
Run Code Online (Sandbox Code Playgroud)
这两者的行为何时不同?我的印象是他们是等价的,但我认为必须有一个区别,因为Backbone使用.call(this)而不是更短的选择.
有什么特别的原因我经常遇到:
(function() {
console.log("Hello");
}).call(this);
Run Code Online (Sandbox Code Playgroud)
代替:
(function() {
console.log("Hello");
})();
Run Code Online (Sandbox Code Playgroud)
传递this给对方时应该有同样的效果吗?
似乎有一些性能差异:http://jsperf.com/call-vs-parenthesis.