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;};