这个函数有关闭吗?

时间:2013-02-28 20:01:59

标签: javascript scope closures

我从这里得到的这个函数(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 = {};

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

2 个答案:

答案 0 :(得分:1)

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

getElements是一个对象,因此您可以为getElements.cache分配值。

这是另一种不会混淆全局命名空间的方法,可能比使用闭包稍微轻一点,但由于属性不是私有的(可以很容易访问)而且(理论上非常)可能导致名字冲突。

答案 1 :(得分:1)

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

此处不涉及任何关闭。