为什么这不起作用?
(function () {
var cache = ['hii'];
return function add (fn) {
if (!cache.contains(fn)) {
cache.push(fn);
return true;
}
return false;
};
}());
add('dd');
我收到一条错误消息:未捕获的referenceError:未定义添加。
答案 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