先说结论

不一定
闭包的定义: 闭包的定义满天飞, 每个人有每个人的理解, 也无法说找到一个官方定义.
MDN: 闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。
JS高级程序设计(第4版):闭包是指有权访问另一个函数作用域中的变量函数;

越定义越局限我们的视野, 阻碍我们去理解闭包, 但确实又需要那么一句话去描述闭包, 我谈谈我心中的这一句话: 理解闭包的关键在于, 外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。

总之, 1.有个外部函数 2.外部函数里有变量 3.同时也有引用这个变量的 (管他叫什么, 函数也好, 对象也好, 反正引用到了这个变量的地方), 4.使用了这个 , 那就构成了闭包

所以根据以上理解, 只要使用了这个, 这个地方当然可以是一个内部函数, 外部函数中返回一个内部函数, 在调用外部函数的时候就相当于调用了这个内部函数, 固然能叫闭包

1
2
3
4
5
6
7
function f1(){
var n = 999;
return function (){
console.log(n); // 这个敦
}()
}
f1() // 使用了敦

那不返回呢, 直接在里面调用, 也能叫闭包…

1
2
3
4
5
6
7
8
function f1(){
var n = 999;
function f2(){
console.log(n); // 这个敦
}
f2() // 使用了敦
}
f1() // 调用f1()会连锁触发调用f2()

又例如呢, 不存在内部函数的情况, 返回的是一个对象… :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function outer(){
var a = 1;
return {
setA: function(val) {
a = val; // 这个敦
},
getA: function() {
return a; // 这个敦
}
};
}
var closure = outer();
console.log(a); //报错
console.log(closure.getA()); // 使用了敦 1
closure.setA(2); // 使用了敦
console.log(closure.getA()); // 使用了敦 2

不是为了设计一个闭包概念才出现的闭包,而是,js这门需要创造出来之后,存在一些天然的规律,总结这些规律成一种特性,这种特性叫啥好呢? 就叫closure(闭包)吧。
所以看完你理解了吗? 没理解的话找其他的文章看看吧.