Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数表达式中的私有变量_Javascript_Private_Public - Fatal编程技术网

Javascript 函数表达式中的私有变量

Javascript 函数表达式中的私有变量,javascript,private,public,Javascript,Private,Public,为什么这不起作用 (function () { var cache = ['hii']; return function add (fn) { if (!cache.contains(fn)) { cache.push(fn); return true; } return false; }; }()); add('dd'); 我收到一个错误,上面写着:Unca

为什么这不起作用

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

add('dd');

我收到一个错误,上面写着:Uncaught referenceError:add未定义。

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

(请注意,给
add
一个名称并不意味着它就可以使用该名称;因为它是
return
语句的一部分,它变成了一个与函数声明具有相同语法的语句,但不会导致创建指向该函数的变量。)

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

add = (function () {

外部匿名函数返回内部的
add
函数,但返回值没有分配给任何对象,因此您无法访问它

(请注意,给
add
一个名称并不意味着它就可以使用该名称;因为它是
return
语句的一部分,它变成了一个与函数声明具有相同语法的语句,但不会导致创建指向该函数的变量。)

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

add = (function () {
试着给iLife命名:

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
(函数(){
var cache=['hii'];
返回函数添加(fn){
如果(!cache.contains(fn)){
cache.push(fn);
返回true;
}
返回false;
};
}('dd'))// 试着给iLife命名:

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
(函数(){
var cache=['hii'];
返回函数添加(fn){
如果(!cache.contains(fn)){
cache.push(fn);
返回true;
}
返回false;
};

}('dd'))// 函数表达式与函数声明的有趣示例,将自身伪装为范围问题

看这个例子

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

函数表达式与函数声明的有趣示例,将自身伪装为范围问题

看这个例子

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

因为它不是全球性的。。。这种回报没有任何作用…因为它不是全球性的。。。这种回报毫无作用……这里的情况并非如此。这是因为它是一个函数表达式,正如Adam Brenecki所说,它不是一个范围问题。这是因为它是一个函数表达式,正如Adam Brenecki所说,它不是一个范围问题。无论如何,如果其他人感兴趣,我使用的是contains方法:Array.prototype.contains=function(obj){var I=this.length;而(I--){if(this[I]==obj){return true;}返回false;};无论如何,如果其他人对此感兴趣,这里是我使用的contains方法:Array.prototype.contains=function(obj){var I=this.length;而(I--){if(this[I]==obj){return true;}}return false;};