当阅读一些javascript源代码时,我发现下面的代码:
var fullname = function(){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return function(name){
return shorts[name] || name;
}
}();
通过返回另一个函数更有效还是其他原因? 为什么不使用:
function fullname(name){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return shorts[name] || name;
}
答案 0 :(得分:2)
这相当于
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
function fullname(name){
return shorts[name] || name;
}
......它的作用。但是
var fullname = function(){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return function(name){
return shorts[name] || name;
}
}();
...确保散列/对象shorts
仅为* 私有仅限于函数fullname
*
所以回答你的问题,为什么不呢
function fullname(name){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return shorts[name] || name;
}
下面' shorts
隐藏在fullname
内,但正如Dogbert指出的那样,它的速度较慢
因为哈希shorts
是在每次调用时创建的。
但是这给了两个世界的好处:
var fullname = function(){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return function(name){
return shorts[name] || name;
}
}();
shorts
仍然私有到fullname
同时,shorts
仅实例化一次,因此性能将会如此
也很好。
这就是他们所谓的 IIFE (立即调用函数表达式)。这个想法是
在函数A
中创建函数B
并声明用于函数A
的变量
在函数B
;范围内,只有函数A
才能看到它们。
var B = function(){
// this is B
//
val foo = {x:1}; // this is ONLY for A
val A = function(arg0) {
// do something with arg0, foo, and whatever
// and maybe return something
};
return A;
};
val A = B();
如您所见,这与
相同 var A = (function(){
// this is in 'B'
//
val foo = {x:1}; // this is ONLY for A
return function(arg0) { // this is in A
// do something with arg0, foo, and whatever
// and maybe return something
};
})(/*calling B to get A! */);
在功能方面,这与
完全相同 val foo = {x:1}; // foo is visible OUTSIDE foo!
val A = function(arg0) {
// do something with arg0, foo, and whatever
// and maybe return something**strong text**
};
我没有看到任何其他用途。
所以它只是一种保持变量私有的方式,而同时,
没有失去表现。
答案 1 :(得分:0)
在另一个函数中返回一个函数会导致创建一个闭包。在这种情况下,内部函数将可以访问外部函数作用域,其中包括对象shorts
。