2

我从这里 ( http://ejohn.org/apps/learn/#19 ) 获得的这个函数,即使它没有任何内部函数在外部函数之后传递的值的“记录”持续存在结束,具有某种类型的数据缓存。事实上,缓存属性中的值在调用该函数后仍然存在。我想知道这是否是一种闭包:

function getElements( name ) { 
  var results; 

  if ( getElements.cache[name] ) { 
    results = getElements.cache[name]; 
  } else { 
    results = document.getElementsByTagName(name); 
    getElements.cache[name] = results; 
  } 

  return results; 
} 
getElements.cache = {};

我不确定它是否适用于函数属性或仅适用于引用的函数。我仍然对闭包感到困惑,所以也许我在胡说八道。

4

2 回答 2

1

不,没有闭包,但是一个函数,就像任何其他 javascript 对象一样,可以接收属性,这就是这里发生的事情。

getElements是一个对象,因此您可以为getElements.cache.

这是不使全局命名空间混乱的另一种方式,可能比使用闭包要轻一些,但由于属性不是私有的(它可以很容易地访问)并且(理论上)可能导致名称冲突,所以不太干净。

于 2013-02-28T20:03:39.913 回答
1

Javascript 中的任何函数都是对象。存储在函数上的cache属性对于getElements函数的所有调用都是相同的。

这里不涉及关闭。

于 2013-02-28T20:04:38.400 回答