>  Q&A  >  본문

javascript - 这个到底是不是闭包?

在立即执行函数中直接执行show,chrome显示为闭包,而show是在词法作用域里面执行的,好像有在词法作用域外面调用才会形成闭包,不知道我的理解对不对?比如下面的执行:

是chrome不准确吗?要以什么为标准?

你不知道的JavaScript地57页是这么定义闭包的:
当函数可以记住并访问所在的词法作用域, 即使函数是在当前词法作用域之外执行, 这时就产生了闭包。

你不知道的JavaScript代码:

解释:

那就是这本书和chrome的结果是不一样的。

function foo() {
    var a = 2;
    function bar() {
        a++;
        console.log(a);
    }
    bar();//3
    bar();//4
}
foo();

按照书中的说法这和按照词法作用域查找没啥区别。对原著作者提问,他的回答:
Academically it's called a closure... but observationally it's not different from lexical scope lookup. closure is the ability for that lexical scope to be preserved even when the function runs elsewhere. I define closure not by academic technicalities but by pragmatic observations. "scope & closures": ch5,'Nitty Gritty' example is diffrent from chrome

高洛峰高洛峰2721일 전242

모든 응답(5)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-11 13:19:59

    能访问另一个函数内的变量的函数即是闭包

    你体会下这句话

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-11 13:19:59

    people 不是函数内的

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-11 13:19:59

    说几点个人理解:

    1.闭包指的是函数的运行时环境,你的第一个demo里的show运行时环境就是你那个自调用函数,因此变量people在自调用函数作用域内。
    2.第二个demo你把baz函数抛给了全局变量fn,然后通过bar函数调用baz,此时baz的运行时环境就是定义baz函数时候的foo函数,因此闭包为foo,而foo作用域下有变量a。

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-11 13:19:59

    What is clojure:

    One function 'baz' can get the variable a from father scope, here is" function foo() {...scope...} " and variable a can't be accessed from higher scope Therefor foo().a === undefine.
    So the variable a can and only can be accessed from a function inside another function.

    Let me say it again. It is what clojure means. Wrap a variable inside a function that only can be accessed from another function inside this function.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-11 13:19:59

    你的代码在原理上是闭包,在应用上不是闭包。
    个人也一直有这样的疑惑?因为有人一直认为闭包的一个必要条件就是内部函数在外部函数的词法作用域外调用。但我个人感觉并不是,不管是一些权威书籍还是chrome的显示,没有说明这个条件的必要性。其实 1.闭包的实质就是将函数的变量保存在函数的作用域内,闭包就是函数内的一个对象,每个函数都有(是)必包。但这没有任何意义,然后人们就觉得闭包中应该读到函数外的变量,于是 2.闭包变成了当函数执行时,能够访问到函数外定义的变量,函数就产生了必包。但这不就是作用域链吗,这有什么用,这也能算高级特性?于是又有了第三种说法,3.内部函数在外部函数的词法作用域外执行时,能访问到外部函数的变量,就产生了闭包。
    我们现在所说的闭包,我感觉更应该是闭包的引申或闭包的应用,但由第三种说法定义的闭包更"有用",因为一些高级的封装都是闭包(的应用),久而久之,人们都认同了内部函数在外部函数的词法作用域外执行这个前提,认为是个必要条件,但实际上这并不是闭包的必要条件,而是有应用价值的闭包的必要条件。
    总结一下,你的代码在原理上是闭包,在应用上不是闭包。
    现在你和别人说闭包的本质是对象,内部函数在外部函数词法作用域内执行也会产生闭包,你看书上是这么说的,
    chrome是这么显示的,脾气不好的,直接就不怼你了,开放点的会问你“有什么用?”。

    회신하다
    0
  • 취소회신하다