1
charlie21 2022-01-26 12:23:27 +08:00
https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
搜关键字 内存,理解一下闭包对内存的影响 |
3
zythum 2022-01-26 12:49:13 +08:00
你这种情况,大体是一样的。每一个实例都是使用自己创建的 add 方法。一般来说你下面的情况叫工厂函数。
但是上面的情况,大概应该写成这样就不一样的。 function Foo() { this.a = 1; } Foo.prototype.add = function () { this.a++; } 每个 Foo 实例是共用 prototype 上的 add 方法的。 |
4
rabbbit 2022-01-26 13:06:08 +08:00
上边那个构造函数大概可以理解成:
function Foo() { var obj = {}; var a = 1; obj.get = function () { console.log(a); }; obj.add = function () { a++; }; return obj; } let foo1 = Foo() |
6
cheots 2022-01-26 13:19:46 +08:00 via iPhone
|
7
rabbbit 2022-01-26 13:21:04 +08:00
要我个人理解 this.get/this.add 对 var a 的引用算闭包
|
8
mozhizhu 2022-01-26 13:52:15 +08:00
c1 和 c2 在内存索引上是同一个
|
10
2i2Re2PLMaDnghL 2022-01-26 14:04:07 +08:00
构造函数的区别是 prototype 可以共用,其他并无影响。
我仍然不推荐称呼闭包,闭包是一种__实现__而不是__语法__。这种语法叫做「词法作用域」。 |
11
KuroNekoFan 2022-01-26 14:16:14 +08:00
|
12
2i2Re2PLMaDnghL 2022-01-26 14:33:47 +08:00
@KuroNekoFan 当然不是,一种语法和一种实现的技术当然不是一回事。
实际上被称为闭包的实体,就是那个可以 xxx() 的东西。你已经找不到函数本身了。 就算是 new Function 出来的也是个闭包,只是父级域不是当前域而是全局域来着。 |
13
KuroNekoFan 2022-01-26 14:52:44 +08:00
@2i2Re2PLMaDnghL 嗷我我误会了,楼主这个确实更能体现 lexical scope 的特性而不是闭包
|
14
QGabriel OP @2i2Re2PLMaDnghL 你意思是说只有函数本身消失了但其作用域还在的方式叫闭包?构造函数那种不算闭包吗?
|
15
2i2Re2PLMaDnghL 2022-01-26 16:03:46 +08:00
@QGabriel 不是函数本身消失了,而是封在闭包里;并且在现在大部分支持闭包的语言中,你找不到函数本身,只能找到包含这个函数的闭包。你几乎不可能生成函数的引用,只能生成闭包的引用;你也无法直接调用函数,只能调用闭包让闭包去调用函数。
但因为这个闭包是 first-class function 的一个实例,也是你唯一可以找来调用的东西,所以实际上大部分人在所有时间并且所有人在大部分时间还是称闭包为函数。 至于你#14 的这句话,因为太过混乱我甚至不知道从哪开始回复。 你根本拿不到函数,因为函数早已被(编译器、解释器)封装进闭包。 除非你能想办法把让这段代码返回 true (function(){ var a = {}; // create something called new_get with foo1.get return a===new_get() }) |
16
codermagefox 2022-01-26 16:16:54 +08:00
真无聊..
|
17
pendulum 2022-01-26 16:55:59 +08:00
你运行过了吗?我的运行结果是 2 1 1 1
|