Warning:
This wiki has been archived and is now read-only.
規範意見
Reference 和 environment
GZhang(173574) 13:10:34
我觉得ES5有一处很奇怪,就是Reference和environment
winter(shaofeic)(348853132) 13:10:48
说吧说吧
GZhang(173574) 13:10:51
Reference作为基础类型,感觉不应该去知道自己跟environment record啥关系这样……
winter(shaofeic)(348853132) 13:10:52
哪里奇怪?
winter(shaofeic)(348853132) 13:11:12
对呀
GZhang(173574) 13:11:21
如此一来,如果我分模块,那就是Reference所在的generic需要引用Environment Record所在的environment,反着environment也要引用generic
GZhang(173574) 13:11:40
直接就循环引用搞不出来了……只能把它们混成一坨放在一起么……
winter(shaofeic)(348853132) 13:11:49
你是说 Reference的base?
GZhang(173574) 13:11:59
嗯
GZhang(173574) 13:12:23
要给environment record特地开个if分去实在很那啥……
winter(shaofeic)(348853132) 13:12:35
呃
winter(shaofeic)(348853132) 13:12:38
不是那样的
Franky(449666) 13:12:57
我觉得浏览器在这里 根本不需要鸟ES
Franky(449666) 13:13:07
他只要保证对外 可见的部分 符合ES即可
GZhang(173574) 13:13:13
我在想witner的jsinjs……
winter(shaofeic)(348853132) 13:13:14
if(type(lhs) == "Reference" && IsStrictReference(lhs) && type(GetBase(lhs)) == "EnvironmentRecord" && (GetReferencedName(lhs) == "eval" || GetReferencedName(lhs) == "arguments")) throw new SyntaxError();
Franky(449666) 13:13:16
比如v8的优化
winter(shaofeic)(348853132) 13:13:20
这样写
winter(shaofeic)(348853132) 13:13:26
type(GetBase(lhs)) == "EnvironmentRecord"
Franky(449666) 13:14:07
去WC . 回来看杰伦
Franky(449666) 13:14:13
结论.
GZhang(173574) 13:14:19
GetBase不是应该返回一个environment record object吗,是个字符串?
winter(shaofeic)(348853132) 13:14:29
还有type呢
winter(shaofeic)(348853132) 13:14:34
type我还没写呢
winter(shaofeic)(348853132) 13:14:41
不过大概打算字符串了
winter(shaofeic)(348853132) 13:14:53
JS里面貌似字符串最快不过了?
GZhang(173574) 13:15:33
就是说 if (Type(GetBase(xx)) === "EnvironmentRecord") {
GetBase(xx).GetBindingValue(GetReferenceName(xx))
} 类似这样了?
winter(shaofeic)(348853132) 13:16:07
这是哪句?
GZhang(173574) 13:16:28
我没写全,大致这意思……
GZhang(173574) 13:16:30
winter(shaofeic)(348853132) 13:16:53
嗯
winter(shaofeic)(348853132) 13:17:10
base must be 不需要写吧
GZhang(173574) 13:17:22
这样的话,其实就是Base这个"class"知道了EnvironmentRecord的IDL了是吧?
winter(shaofeic)(348853132) 13:17:25
写个 assert()
GZhang(173574) 13:17:52
总觉得在一套模块系统中2个模块互相知晓有点那啥……大概源于.net里DLL不能相互环引用的惯性吧……
winter(shaofeic)(348853132) 13:18:20
这个是Reference里面的算法?
GZhang(173574) 13:18:38
8.7,Reference的GetValue的第5步
winter(shaofeic)(348853132) 13:18:48
哦
winter(shaofeic)(348853132) 13:18:52
这个确实不好
GZhang(173574) 13:19:03
在我看来Reference应该是top level了,不应该知道下面有啥specification type的
winter(shaofeic)(348853132) 13:19:23
EnvironmentRecord这里改的不大合理了
winter(shaofeic)(348853132) 13:19:56
要不去提一提?
GZhang(173574) 13:19:59
很诡异的感觉,我觉得应该让EnvironmentRecord那边去伪装成普通的Object或者Proxy来绕到Reference里
winter(shaofeic)(348853132) 13:20:12
嗯 我同意
GZhang(173574) 13:21:47
这个能提的话确实可以提一下啊
winter(shaofeic)(348853132) 13:22:18
去es-discuss里面吵架吧!
winter(shaofeic)(348853132) 13:22:22
灰酱
winter(shaofeic)(348853132) 13:22:25
gogogo!
GZhang(173574) 13:22:29
我最怕吵架这事了!
--
GZhang(173574) 13:53:09
这问题的起因是K大上次那个get y() { delete this.y; }的事- -我在想用js怎么把全过程分解表述出来,结果就发现Reference里有个分支是EnvironmentRecord,但ObjectEnvironmentRecord又会通过bindingObject弄出Reference,这个就烦了……
GZhang(173574) 13:55:52
如果不涉及parser,用JS建立一个ES5中所有有的类型、运算符、内部方法的模型其实也不错,运算符也直接映射成函数,如UnaryAdd(leftHandlExpression)
去除 DOM4 的程式語言相關性
kennyluck<kennyluckco@gmail.com> 00:34:43
你現在好像有兩個意見:1) ES5+WebIDL+DOM4 要描述 caller 2) DOM4 不應該語言相關
winter(shaofeic)<csf178@163.com> 00:35:23
对
winter(shaofeic)<csf178@163.com> 00:35:35
ES5+WebIDL+DOM4 要描述 caller或者类似信息
winter(shaofeic)<csf178@163.com> 00:35:47
不一定是描述
winter(shaofeic)<csf178@163.com> 00:36:03
应该说 WebIDL+DOM4 要提供caller或者类似信息
kennyluck<kennyluckco@gmail.com> 00:35:43
所以後面這個意見現在該做的事情,是 "callback this value" 這個鍵接不要連到 WebIDL 的 ES 的部份對吧?
winter(shaofeic)<csf178@163.com> 00:36:32
前一个可以忽略好了
winter(shaofeic)<csf178@163.com> 00:36:37
不是什么重要的事情
kennyluck<kennyluckco@gmail.com> 00:36:17
WebIDL + DOM4 提供 caller 但是 ES5 不提供還蠻奇怪的吧?
kennyluck<kennyluckco@gmail.com> 00:36:38
還是無所謂?
winter(shaofeic)<csf178@163.com> 00:37:20
kennyluck<kennyluckco@gmail.com> 0:36:17 WebIDL + DOM4 提供 caller 但是 ES5 不提供還蠻奇怪的吧?
我想提供的应该是"足以满足任何语言函数调用所需的信息"
winter(shaofeic)<csf178@163.com> 00:37:29
不是caller这样具体的东西
kennyluck<kennyluckco@gmail.com> 00:37:33
我聽不懂了,具體 DOM4 該做什麼?
winter(shaofeic)<csf178@163.com> 00:38:05
JS函数调用大概要提供的就是 caller、arguments和thisValue
winter(shaofeic)<csf178@163.com> 00:38:41
可能某种语言要函数调用的时候提供完整的call stack之类
kennyluck<kennyluckco@gmail.com> 00:39:18
你是說 DOM4 應該要求實現 DOM4 的語言在調用 DOM4 的函數的時候提供完整的 call stack?
winter(shaofeic)<csf178@163.com> 00:41:13
好吧 先不说1的问题了
winter(shaofeic)<csf178@163.com> 00:41:17
先说2好了
kennyluck<kennyluckco@gmail.com> 00:40:58
嗯
kennyluck<kennyluckco@gmail.com> 00:41:20
現在 "If listener's listener is a Function object, its callback this value is the event's currentTarget attribute value." 看來有兩個問題
kennyluck<kennyluckco@gmail.com> 00:41:40
1) Function 2) 那個 "callback this value" 連到 WebIDL 不是語言獨立的部份
kennyluck<kennyluckco@gmail.com> 00:41:56
我覺得 1) 只是筆誤 2) 的話…
kennyluck<kennyluckco@gmail.com> 00:43:04
2) 的話,反正 WebIDL 動一點編輯手術也可以把 "callback this value" 的定義拿到語言獨立的部份。
kennyluck<kennyluckco@gmail.com> 00:43:31
這樣做有沒有合你的意思?
winter(shaofeic)<csf178@163.com> 00:44:15
我觉得比较合理的做法是:
DOM4里面写:
callback interface EventListener {
EventTarget eventContext; void handleEvent(Event event);
};
WebIDL JSBinding里面写
JS函数Function 绑定到 callback interface EventListener {
EventTarget eventContext; void handleEvent(Event event);
}; 这个时候
应该把EventTarget作为thisValue
winter(shaofeic)<csf178@163.com> 00:46:42
也许最好callback统一一点
winter(shaofeic)<csf178@163.com> 00:46:49
继承个基类
winter(shaofeic)<csf178@163.com> 00:46:56
这样WebIDL里比较好办
kennyluck<kennyluckco@gmail.com> 00:47:38
現在的問題是
callback interface EventListener {
EventTarget eventContext; void handleEvent(Event event);
};
不是 WebIDL… 你是要 attribute EventTarget eventContext; ?
winter(shaofeic)<csf178@163.com> 00:48:49
嗯
kennyluck<kennyluckco@gmail.com> 00:49:02
假如 "callback this value" 這個詞彙改一個名字(比如說改成 "callback self value"),然後定義是語言獨立的,這樣沒有解決你的問題?
winter(shaofeic)<csf178@163.com> 00:49:54
没有
winter(shaofeic)<csf178@163.com> 00:50:02
因为比如C++它不需要这东西
winter(shaofeic)<csf178@163.com> 00:50:20
另外C++拿到这东西放到哪里呢?
winter(shaofeic)<csf178@163.com> 00:50:24
这些没说清
kennyluck<kennyluckco@gmail.com> 00:51:42
我問你一個問題,假如說有一種狀況是 element.onclick = { handleEvent: fuction(){}, eventContext: 別的元素 }
winter(shaofeic)<csf178@163.com> 00:52:30
嗯
kennyluck<kennyluckco@gmail.com> 00:52:03
這樣 this 會是 element 還是別的元素?
winter(shaofeic)<csf178@163.com> 00:53:09
呃 但是这件事情难道不应该是事件触发时决定的么?
kennyluck<kennyluckco@gmail.com> 00:53:52
所以是 element?
kennyluck<kennyluckco@gmail.com> 00:54:30
我只是問你想像 WebIDL 改了的情形會不會有額外的效果而已。
winter(shaofeic)<csf178@163.com> 00:55:17
这个传进去的eventContext不太有意义吧
winter(shaofeic)<csf178@163.com> 00:56:10
抛开DOM现在不支持这种写法的因素
winter(shaofeic)<csf178@163.com> 00:56:30
也许应该 callback interface EventListener {
void handleEvent(EventTarget eventContext,Event event);
};
winter(shaofeic)<csf178@163.com> 00:56:34
这样更合理?
winter(shaofeic)<csf178@163.com> 00:57:06
eventContext这个属性反正就只为了传给handleEvent而已
winter(shaofeic)<csf178@163.com> 00:59:39
先回家了 明天接着说
kennyluck<kennyluckco@gmail.com> 00:59:47
嗯,感覺 WebIDL 要動不小的手術才能滿足你的要求啊…
winter(shaofeic)<csf178@163.com> 01:00:34
可能是吧
Tapir(bqian)(1050409015) 01:00:18
还没回家。。。
winter(shaofeic)<csf178@163.com> 01:00:57
这地方就是很不好办呢
Tapir(bqian)(1050409015) 01:00:28
周末,还这么晚。。。
winter(shaofeic)<csf178@163.com> 01:01:03
本来想做点事情
winter(shaofeic)<csf178@163.com> 01:01:11
不过扯了下蛋就......
winter(shaofeic)<csf178@163.com> 01:01:18
我晚上才过来的
kennyluck<kennyluckco@gmail.com> 01:01:24
要是我的話,就
kennyluck<kennyluckco@gmail.com> 01:01:54
winter(shaofeic)(348853132) 00:49:47 另外C++拿到这东西放到哪里呢?
當 WebIDL 出了一個 C++ Chapter 的時候,特別提到無視這個 "callback this value" 之類的。
winter(shaofeic)<csf178@163.com> 01:02:49
C++可能也要用到这个信息呢
winter(shaofeic)<csf178@163.com> 01:03:02
明天我看看MS的DOM是怎么做的
kennyluck<kennyluckco@gmail.com> 01:02:32
winter(shaofeic)(348853132) 00:55:57 也许应该 callback interface EventListener {
void handleEvent(EventTarget eventContext,Event event);
};
這個現在跟 Java 兼容嗎?
winter(shaofeic)<csf178@163.com> 01:03:16
不兼容 需要特别定义如何绑定
winter(shaofeic)<csf178@163.com> 01:03:35
反正callback都很烦
kennyluck<kennyluckco@gmail.com> 01:03:29
我覺得你好像在要求一個跟我說的小手術沒有實質差異的大手術…
winter(shaofeic)<csf178@163.com> 01:04:43
也许是洁癖
winter(shaofeic)<csf178@163.com> 01:04:51
- -!
winter(shaofeic)<csf178@163.com> 01:05:27
关键是对WebIDL而言 实在无法融合callback this value
kennyluck<kennyluckco@gmail.com> 01:05:00
winter(shaofeic)(348853132) 01:02:43 不兼容 需要特别定义如何绑定
假如 WebIDL 每個語言相關的部份要提到這些,那就跟每個語言相關部份怎麼處理 "callback this value" 這個概念的意思一樣了不是嗎?
winter(shaofeic)<csf178@163.com> 01:05:55
就是我觉得这件事应该在WebIDL里面提
winter(shaofeic)<csf178@163.com> 01:06:04
不应该在DOM里面提
winter(shaofeic)<csf178@163.com> 01:06:22
我也没大想清楚具体怎么定义好
kennyluck<kennyluckco@gmail.com> 01:05:52
這件事目前是在 WebIDL 裡面提,"callback this value" 鍵接到 WebIDL 裡
kennyluck<kennyluckco@gmail.com> 01:06:25
他只是一個概念的名稱,用比較 JS 的字眼… 所以我之前問過你要不要改名…
winter(shaofeic)<csf178@163.com> 01:07:08
绝对不是改名的问题
winter(shaofeic)<csf178@163.com> 01:07:38
我是觉得应该用IDL的方式解决
winter(shaofeic)<csf178@163.com> 01:07:44
不说了 赶紧回家了
kennyluck<kennyluckco@gmail.com> 01:07:15
嗯,先掰。
kennyluck<kennyluckco@gmail.com> 08:56:06
winter(shaofeic)(348853132) 01:02:16 C++可能也要用到这个信息呢
需要用到這個訊息的時候可以用 event.currentTarget。this 本來就算是捷徑吧?
NodeFilter 多加一個返回值(TreeWalker 之用)
米粽: 21:47:05
觉得有一个2000年定稿的spec有可以改进的地方,现在是不是有点晚了……
kennyluck: 21:55:55
米粽: 21:47:05 觉得有一个2000年定稿的spec有可以改进的地方,现在是不是有点晚了……
永遠不嫌晚… 一般要看對舊網站的兼容影響…
kennyluck: 21:55:57
說吧
米粽: 21:57:50
kennyluck: 21:58:06
什麼樣的改進?
米粽: 21:58:15
acceptNode方法的的返回值只有三个
米粽: 21:58:52
我想要一个返回值,能返回当前node,但忽略掉它的children
米粽: 22:00:51
按照目前的规范,我必须先返回accept,进到它的children以后,再去看parentNode是否符合我设定的条件,以决定当前children的返回值
米粽: 22:03:19
这是对TreeWalker而言的。对NodeIterator,这个“我想要的返回值”应该和FILTER_ACCEPT一致。
kennyluck: 22:04:55
(嘗試理解中)
米粽: 22:06:36
我犹豫有没有意义的另一个原因,是它的浏览器实现效率不高,比自己手写的递归还要慢1/4左右
kennyluck: 22:18:35
問題:為什麼要用 TreeWalker 而不用 NodeIterator?
米粽: 22:19:27
源于这篇blog:http://forcefront.com/2012/an-interview-quiz-filtered-dom-selector/
米粽: 22:20:03
我需要层级结构,而NodeIterator是扁平的
'kennyluck: 22:29:11 ' 我的建議是:你寫信吧,這裡可以提供完全中 → 英翻譯。建議寫長一點,建議架構: 1) 使用情節 — 為什麼需要這個東西(就拿那篇 blog 的問題) 2) 當前設計的問題 3) 提案(FITLER_XXX)
米粽: 22:30:02
ok,我试试
kennyluck: 22:30:28
s/當前設計的問題/當前 TreeWalker 的不好之處/ — 你可以附上你說「按照目前的规范,我必须先返回accept,进到它的children以后,再去看parentNode是否符合我设定的条件」的這個代碼