V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
gino86
V2EX  ›  JavaScript

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

  •  
  •   gino86 · 2017-09-27 12:14:03 +08:00 · 3688 次点击
    这是一个创建于 2647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    window.onload = function(){
        var data = 10;
        function log(){
            console.log(data);
        }
    }
    

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

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

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

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

    闭包必须作为函数的返回值赋值给函数外部的变量,这样才能从外部访问函数内封闭的作用域,不然不能达到预期的目的,也就称不上闭包了
    SuperMild
        5
    SuperMild  
       2017-09-27 13:30:05 +08:00   ❤️ 1
    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
        6
    gino86  
    OP
       2017-09-27 13:47:50 +08:00
    @rotoava @SuperMild MDN 上关于闭包的内容我也看过,不过通常现在网络上很多关于闭包的文章都会明确说某某函数是闭包,包括油管上面的大部分视频都是这样介绍的。当然有的说是外部函数,有的说是内部函数。
    但如果运行下面的代码
    https://gist.github.com/tangino/b4da28355be2a3362243b27a4845e37d.js

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

    我们通常说的 return function () {} 这个并不是闭包的定义,而是闭包的应用。在你的例子里
    var data = 10
    function log () {
    console.log(data)
    }
    就是一个闭包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:21 · PVG 06:21 · LAX 14:21 · JFK 17:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.