2016-03-06 50 views
1

我最近从page阅读了与JavaScript相关的教程,我尝试了一些代码,但是我不明白一些逻辑。以下是作者代码。关于JavaScript数组原型

函数本身:

var lz=""; 
lz.memo = function (fn) { 
var cache = {}; 
return function() { 
    var key = [].join.call(arguments, '§') + '§'; 
    if (key in cache) { 
     return cache[key];  } 
    return cache[key] = fn.apply(this, arguments); 
    }; 
}; 

及其执行

var foo = 1; 
function bar(baz) { 
    return baz + foo; 
} 
var cached = lz.memo(bar); 
console.log(cached(1)); 
foo += 1; 
console.log(cached(1)); //2 

但是,如果我改变

var key = [].join.call(arguments, '§') + '§'; 

var key=arguments[0]; 

它也可以工作(缓存工程)。这里作者使用的目的是什么

var key = [].join.call(arguments, '§') + '§'; 

感谢关注!这里是CODEPEN of code

回答

0

它也可以(高速缓存作品)

只是因为你只用一个参数来调用它。 (而且也不太相同的方式工作,缓存键将在关键的是,原来的代码有缺少§。)

什么是这里的目的,作者使用

他们正在创建一个字符串与大家在供给到底它们之间§§连接在一起的参数,就像这样:

function foo() { 
 
    return [].join.call(arguments, '§') + '§'; 
 
} 
 
snippet.log(foo(1)); // 1§ 
 
snippet.log(foo(1, 2)); // 1§2§ 
 
snippet.log(foo("a", "b", "c")); // a§b§c§
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

他们这样做是因为arguments阵列状,但它不是一个数组,所以它不会从Array.prototypejoin方法。

其实没有理由为他们创建的临时数组,你可以叫join直接:

return Array.prototype.join.call(arguments, '§') + '§'; 

另一个OPTON是arguments转换为实际的数组:

return Array.prototype.slice.call(arguments).join('§') + '§'; 

还是在ES2015 (或用垫片):

return Array.from(arguments).join('§') + '§'; 
+0

非常感谢你 –

+0

这里foo变量被定义为全局变量。如果我在关键变量旁边定义foo,函数会抛出未定义的foo变量。如何初始化和分配foo变量的下一个键,使函数可以添加? –

+0

@AzerQurbanov:对不起,我无法理解。尽管如此,这听起来像是一个新问题。如果是这样,发布一个新问题。 :-) –