函数表达式中的私有变量

时间:2014-05-24 01:41:05

标签: javascript private public

为什么这不起作用?

(function () {
    var cache = ['hii'];
    return function add (fn) {
         if (!cache.contains(fn)) {
              cache.push(fn);
              return true;
         }
         return false;
    };
}());

add('dd');

我收到一条错误消息:未捕获的referenceError:未定义添加。

3 个答案:

答案 0 :(得分:2)

外部匿名函数返回内部add函数,但返回值未分配给任何内容,因此您无法访问它。

(请注意,为add提供一个名称并不意味着它可以通过该名称使用;因为它是return语句的一部分,它变为function expression,令人困惑的是与函数声明具有相同的语法,但不会导致创建指向该函数的变量。)

尝试将第一行更改为如下所示:

add = (function () {

答案 1 :(得分:1)

尝试命名IIFE:

var foo = (function () {
  var cache = ['hii'];
  return function add (fn) {
     if (!cache.contains(fn)) {
          cache.push(fn);
          return true;
     }
     return false;
  };
 }());

foo('dd');

调用IIFE的另一种方法是对其进行参数化:

(function () {
  var cache = ['hii'];
  return function add (fn) {
     if (!cache.contains(fn)) {
          cache.push(fn);
          return true;
     }
     return false;
  };
 }('dd')); //<--params here

答案 2 :(得分:1)

函数表达式与函数声明的有趣例子,将自己伪装成范围问题。

参见此示例

var x=function y() {return 1;};
console.log(x()); //1
console.log(y()); //ReferenceError: y is not defined

你可以修改你的代码并且它可以工作,因为你现在将函数分配给变量add,这是隐式全局的:

(function () {
    var cache = ['hii'];
    return add = function (fn) {
         if (!cache.contains(fn)) {
              cache.push(fn);
              return true;
         }
         return false;
    };
}());

add('dd'); //true

如果是这样,那么这将是一个范围问题:

(function () {
    var cache = ['hii'];
    var add;
    return add=function (fn) {
         if (!cache.contains(fn)) {
              cache.push(fn);
              return true;
         }
         return false;
    };
}());

add('dd'); //ReferenceError: add is not defined