闭包是外层函数还是内层函数

2017-09-27 12:14:03 +08:00
 gino86
window.onload = function(){
    var data = 10;
    function log(){
        console.log(data);
    }
}

上面的代码中闭包是 window.onload 还是 log

3483 次点击
所在节点    JavaScript
10 条回复
rotoava
2017-09-27 12:41:46 +08:00
闭包是种技术实现,实现了函数(一等函数)的完整性。
按照你的例子要是硬说某某是闭包的话:'''log()''' 及它的外层环境 '''var data''' 是闭包( runtime 把这个闭包实现好了),这个闭包作用是维持 '''log()''' 函数的完整性(如果你想在其他地方用这个 log 也是工作正常的)。

鄙见
hanangellove
2017-09-27 13:00:17 +08:00
例子中的闭包是 function(){}。
autoxbc
2017-09-27 13:22:42 +08:00
高程里说闭包是 log()

闭包并不关心外层函数,只关心外层函数限定出的作用域,和访问这个作用域的方法,这个方法被称为闭包
autoxbc
2017-09-27 13:29:06 +08:00
另外题主这个不是闭包吧,应该这么写
return function log(){...}

闭包必须作为函数的返回值赋值给函数外部的变量,这样才能从外部访问函数内封闭的作用域,不然不能达到预期的目的,也就称不上闭包了
SuperMild
2017-09-27 13:30:05 +08:00
Closures - JavaScript | MDN
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
A closure is the combination of a function and the lexical environment within which that function was declared.

1 楼说的符合这个定义。
gino86
2017-09-27 13:47:50 +08:00
@rotoava @SuperMild MDN 上关于闭包的内容我也看过,不过通常现在网络上很多关于闭包的文章都会明确说某某函数是闭包,包括油管上面的大部分视频都是这样介绍的。当然有的说是外部函数,有的说是内部函数。
但如果运行下面的代码
https://gist.github.com/tangino/b4da28355be2a3362243b27a4845e37d.js

chrome 控制台中显示闭包是 window.onload
SuperMild
2017-09-27 14:14:56 +08:00
@gino86 你误会了控制台的意思,它的意思是 log 处于一个 closure 环境中,其环境是 window.onload
SuperMild
2017-09-27 14:17:08 +08:00
console.dir(onload) 才是查看 window.onload 的环境,可以看到它只在 global 里,不在 closure 里
roadwild
2017-09-27 14:59:51 +08:00
@autoxbc 你说的这点《你不知道 js 》中有说到,作者说了,从技术上说是闭包,但是如果不返回函数到其所处的函数外部就会没有意义,从这点来说的话它就不是闭包。个人比较赞同 @rotoava 的说法,他是一种特性。非要说闭包是某个东西的话,我认为是内部函数及其所持有的所有外部可访问的自由变量。
jesseccchen
2017-09-27 20:13:20 +08:00
1 楼说的对。

我们通常说的 return function () {} 这个并不是闭包的定义,而是闭包的应用。在你的例子里
var data = 10
function log () {
console.log(data)
}
就是一个闭包

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/394019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX