1
binux 2013-06-28 23:44:08 +08:00 1
算
|
2
heroicYang 2013-06-28 23:45:56 +08:00 via iPhone 1
算的。
|
3
darasion 2013-06-28 23:51:29 +08:00
贴gist貌似不能用httpS
|
4
switch 2013-06-28 23:52:24 +08:00 via Android
不要为了闭包而闭包,在 ECMAScript 5 里就没有专门描述这个的。
|
5
sivacohan OP |
6
Mutoo 2013-06-28 23:53:59 +08:00 1
|
7
sivacohan OP @switch 这个地方用闭包有两个原因,一个是命名空间,js太多了。另外一个是我希望能通过
var abc = obj('xxx') 这种形式获得一个对象。页面上会有几个obj对象。 在这我究竟到底是这么写,还是用new来完成。本能的不喜欢js的new |
8
Mutoo 2013-06-28 23:55:42 +08:00 1
@sivacohan 关于javascript类继承,有一篇很有名的文章,请参见 http://ejohn.org/blog/simple-javascript-inheritance/
|
11
Golevka 2013-06-29 13:59:09 +08:00
@switch ECMAScript 5中明确说明了什么是Lexical Environment, 并且13.2: Creating Function Objects中也明确说明创建一个函数对象需要"a Lexical Environment specified by Scope", 这不就是你们喜闻乐见的闭包么?
|
12
switch 2013-06-29 15:02:19 +08:00
@Golevka 就是没有明确定义“闭包”这个词。所以说与其去抓这个词还不如去理解 Lexical Environment 了(话说从这个词的字面意思上也不好理解)。
|
13
Golevka 2013-06-29 15:12:12 +08:00
@switch 我倒是感觉理解了词法作用域再去理解闭包就很清晰了, 其实闭包的最简单实现方法就是把lambda和当前env绑定在一起求值成一个closure (ECMAScript中也是这么描述的).
|
15
heroicYang 2013-06-30 10:02:09 +08:00
@sivacohan 用模拟类继承和原型式继承都是可以的~
|
16
DaniloSam 2013-06-30 12:15:30 +08:00
闭包: 红宝书第二版145页(抱歉我买的时候没有第三版), 理解作用域链和lambda表达式就理解了闭包了
new是个啥东西, 想生成对象想继承咋办? 可以参看jQuery的构造函数: https://github.com/jquery/jquery/blob/master/src/core.js #41, #81 new出来的对象, 有一个隐藏的__proto__指向原对象的prototype, IE之外的浏览器可以直接访问到, 原对象的prototype上定义的函数, 可以直接调用. 可以理解为new出来的对象, 是原对象的一个实例, 通过__proto__这个属性, 与原对象的原型链建立了链接, 当调用函数的时候, 会对原型链进行查找, 进而访问原型链上的函数 猫头鹰#29写的很清楚了, 可以写几行代码试一下 闭包本质是对作用域链的理解, 不要为了闭包而闭包 |
17
DaniloSam 2013-06-30 12:24:38 +08:00
补充一下:
var Foo = function(){ return "Foo init..."; } Foo.prototype.say = function(){ console.log('hello world'); } var bar = new Foo() , baz = Foo(); bar.say(); baz.say(); 运行结果显而易见, bar.say 通过原型链可以查找到, 所以能打印出'hello world' baz实质上是Foo 构造函数调用的返回值, 在这里指定了返回值, 那就是'Foo init...', 未指定, 则为undefined 此为用了new 和没用new 的区别 所以如果想"造"出一个实例, 别忘了 new , 或者直接在构造函数内返回一个实例, 如jQuery的处理方式, 或参考红宝书#131 对继承和原型链的详细解释 |