2016-03-06 61 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:對不起,我無法理解。儘管如此,這聽起來像是一個新問題。如果是這樣,發佈一個新問題。 :-) –