Warning:
This wiki has been archived and is now read-only.

規範意見

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

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

http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeFilter-acceptNode-constants

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是否符合我设定的条件」的這個代碼