☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 06:44:03 2008) 提到:
http://blowery.org/js/shared-var.html
这个页面很简单,代码是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>shared var</title>
<script type="text/javascript">
var foo = "awesome";
bar = "bartastic";
window.baz = "bazzoom";
</script>
<script type="text/javascript">
if(!window.foo) var foo = "not awesome";
if(!window.bar) var bar = "not bartastic";
if(!window.baz) var baz = "not bazzoom";
</script>
</head>
<body>
<p>Foo is <script type="text/javascript">document.write(foo);</script></p>
<p>Bar is <script type="text/javascript">document.write(bar);</script></p>
<p>Baz is <script type="text/javascript">document.write(baz);</script></p>
</body>
</html>
大多数人都会认为页面输出该是:
Foo is awesome
Bar is bartastic
Baz is bazzoom
吧?
在所有非IE的浏览器里的确如此。不过IE的结果是:
Foo is awesome
Bar is bartastic
Baz is not bazzoom
请问为啥。。。我还真没注意过这种可怕的问题。。(我且先不用bug这个词了吧)。。
☆─────────────────────────────────────☆
Sunshow (新的征程) 于 (Sun Nov 23 07:43:04 2008) 提到:
坐等解释。。。
【 在 sly9 (-_-b) 的大作中提到: 】
:
http://blowery.org/js/shared-var.html: 这个页面很简单,代码是:
: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 08:37:55 2008) 提到:
测试了一下……
感觉上好像 ie 发现 var baz 的写法以后
就把 if(!window.baz) var baz = "not bazzoom"; 给预编译过了的样子……
因为如果改成 if(!window.baz) window.baz = "not bazzoom"; 就没事了
也就是说,为了执行 var baz = 这个变量定义
预先偷偷执行过了 if
纯属瞎猜,谁手头有调试器的,看看每一步变量值?
【 在 sly9 (-_-b) 的大作中提到: 】
:
http://blowery.org/js/shared-var.html: 这个页面很简单,代码是:
: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
: <html>
: <head>
: <title>shared var</title>
: <script type="text/javascript">
: var foo = "awesome";
: bar = "bartastic";
: window.baz = "bazzoom";
: </script>
: <script type="text/javascript">
: if(!window.foo) var foo = "not awesome";
: if(!window.bar) var bar = "not bartastic";
: if(!window.baz) var baz = "not bazzoom";
: </script>
: </head>
: <body>
: <p>Foo is <script type="text/javascript">document.write(foo);</script></p>
: <p>Bar is <script type="text/javascript">document.write(bar);</script></p>
: <p>Baz is <script type="text/javascript">document.write(baz);</script></p>
: </body>
: </html>
: 大多数人都会认为页面输出该是:
: Foo is awesome
: Bar is bartastic
: Baz is bazzoom
: 吧?
: 在所有非IE的浏览器里的确如此。不过IE的结果是:
: Foo is awesome
: Bar is bartastic
: Baz is not bazzoom
: 请问为啥。。。我还真没注意过这种可怕的问题。。(我且先不用bug这个词了吧)。。
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 11:28:21 2008) 提到:
跟这个没关系吧,解决问题的根本在于,对于IE和Firefox,如果跨js代码块的话,window.变量和直接var(或者不var)变量两者之间的区别。如果把两个代码块之间的</script><script...>去掉的话,ie就跟firefox一样了
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 测试了一下……
: 感觉上好像 ie 发现 var baz 的写法以后
: 就把 if(!window.baz) var baz = "not bazzoom"; 给预编译过了的样子……
: ...................
☆─────────────────────────────────────☆
sandaobusi (no lost) 于 (Sun Nov 23 11:35:28 2008) 提到:
为什么会跨js代码块?为什么不一行一行的解释执行?
window.变量和直接var(或者不var)变量两者之间有什么区别?
【 在 lucifor (lucifor) 的大作中提到: 】
: 跟这个没关系吧,解决问题的根本在于,对于IE和Firefox,如果跨js代码块的话,window.变量和直接var(或者不var)变量两者之间的区别。如果把两个代码块之间的</script><script...>去掉的话,ie就跟firefox一样了
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 11:38:31 2008) 提到:
【 在 sandaobusi (no lost) 的大作中提到: 】
: 为什么会跨js代码块?为什么不一行一行的解释执行?
代码是那样写的 js本来就不是一行接一行
: window.变量和直接var(或者不var)变量两者之间有什么区别?
这也是我想明白的,这两者的区别,或者说在IE中这两者有区别,导致了lz问题的产生
☆─────────────────────────────────────☆
sandaobusi (no lost) 于 (Sun Nov 23 11:59:43 2008) 提到:
<script type="text/javascript">
if(!window.foo) var foo = "not awesome";
if(!window.bar) var bar = "not bartastic";
if(!window.baz) var baz = "not bazzoom";
</script>
我debug了一下,在上面这块代码,
如果foo,bar,baz这三个变量任意一个加上window. 解释器就会跳过该js段~
不知道这是为什么。。。(我浏览器用的ff)
【 在 lucifor (lucifor) 的大作中提到: 】
: 代码是那样写的 js本来就不是一行接一行
: 这也是我想明白的,这两者的区别,或者说在IE中这两者有区别,导致了lz问题的产生
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 12:08:31 2008) 提到:
var window.foo = ...
这样?语法错了……
【 在 sandaobusi (no lost) 的大作中提到: 】
: <script type="text/javascript">
: if(!window.foo) var foo = "not awesome";
: if(!window.bar) var bar = "not bartastic";
: if(!window.baz) var baz = "not bazzoom";
: </script>
: 我debug了一下,在上面这块代码,
: 如果foo,bar,baz这三个变量任意一个加上window. 解释器就会跳过该js段~
: 不知道这是为什么。。。(我浏览器用的ff)
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 12:12:44 2008) 提到:
【 在 lucifor (lucifor) 的大作中提到: 】
: 跟这个没关系吧,解决问题的根本在于,对于IE和Firefox,如果跨js代码块的话,window.变量和直接var(或者不var)变量两者之间的区别。如果把两个代码块之间的</script><script...>去掉的话,ie就跟firefox一样了
……问题就是这个 区别 到底是什么……
你这跟没说一样啊
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 12:14:13 2008) 提到:
至少我找出了问题的所在,解决问题的正确方向,至于区别,让牛人来回答吧,我只是抛砖引玉,菜鸟一个
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: ……问题就是这个 区别 到底是什么……
: 你这跟没说一样啊
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 13:25:56 2008) 提到:
能看到一个不错的问题,我很欣慰。
首先,这个问题不可怕。
其次,不用bug这个词是谨慎的做法,以后也要这样。
最后,我的解释在最后。
先看图解。为了简明起见,我把第一个块里的赋值都改为1,第二个里都改为2
执行顺序:
script 引擎全局变量表 window 属性表
0 foo = undefined foo = undefined
1 foo = 1 foo = 1
2 bar = 1 bar = 1
3 baz = 1
----------------------------------------------
4 foo was declared
5 bar was declared
6 baz = undefined baz = undefined
7 baz = 2 baz = 2
______________________________________________
为什么合在一个script块里就好了?
0 foo = undefined foo = undefined
1 bar = undefined bar = undefined
2 baz = undefined baz = undefined
3 foo = 1 foo = 1
4 bar = 1 bar = 1
5 baz = 1 <- baz = 1
6 foo was declared
7 bar was declared
8 baz was declared
______________________________________________
为什么改为 if (! window.baz) baz = 2; 就好了?
0 foo = undefined foo = undefined
1 foo = 1 foo = 1
2 bar = 1 bar = 1
3 baz = 1
----------------------------------------------
4 foo was declared
5 bar was declared
______________________________________________
原因很简单:先declarations后statements
【 在 sly9 (-_-b) 的大作中提到: 】
:
http://blowery.org/js/shared-var.html: 这个页面很简单,代码是:
: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
: ...................
☆─────────────────────────────────────☆
xlambda (隐湖之鲤) 于 (Sun Nov 23 13:34:17 2008) 提到:
我想知道,为什么改成 if (! window.baz) baz = 2; 后,
6,7两行就没有了?
执行顺序:
script 引擎全局变量表 window 属性表
0 foo = undefined foo = undefined
1 foo = 1 foo = 1
2 bar = 1 bar = 1
3 baz = 1
----------------------------------------------
4 foo was declared
5 bar was declared
6 baz = undefined baz = undefined
7 baz = 2 baz = 2
______________________________________________
为什么改为 if (! window.baz) baz = 2; 就好了?
0 foo = undefined foo = undefined
1 foo = 1 foo = 1
2 bar = 1 bar = 1
3 baz = 1
----------------------------------------------
4 foo was declared
5 bar was declared
______________________________________________
【 在 modico ().net() 的大作中提到: 】
: 能看到一个不错的问题,我很欣慰。
: 首先,这个问题不可怕。
: 其次,不用bug这个词是谨慎的做法,以后也要这样。
: ...................
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 13:38:07 2008) 提到:
因为没有var了,就没有declaration了
【 在 xlambda (隐湖之鲤) 的大作中提到: 】
: 我想知道,为什么改成 if (! window.baz) baz = 2; 后,
: 6,7两行就没有了?
: 执行顺序:
: ...................
☆─────────────────────────────────────☆
xlambda (隐湖之鲤) 于 (Sun Nov 23 13:43:23 2008) 提到:
那两个script合在一起后,就多了一个"<-"是为什么呢?
【 在 modico ().net() 的大作中提到: 】
: 因为没有var了,就没有declaration了
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 13:52:08 2008) 提到:
没有解释IE和Firefox的不同之处啊
【 在 modico ().net() 的大作中提到: 】
: 能看到一个不错的问题,我很欣慰。
: 首先,这个问题不可怕。
: 其次,不用bug这个词是谨慎的做法,以后也要这样。
: ...................
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 13:54:36 2008) 提到:
还有为什么window.baz没有出现在script引擎的全局变量表里面啊
【 在 modico ().net() 的大作中提到: 】
: 能看到一个不错的问题,我很欣慰。
: 首先,这个问题不可怕。
: 其次,不用bug这个词是谨慎的做法,以后也要这样。
: ...................
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 13:54:45 2008) 提到:
你很仔细啊
<- 表示给window属性赋值时也会更新script引擎全局变量
【 在 xlambda (隐湖之鲤) 的大作中提到: 】
: 那两个script合在一起后,就多了一个"<-"是为什么呢?
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 13:57:00 2008) 提到:
这我就不好代人解释了,这两家引擎都不是我做的
【 在 lucifor (lucifor) 的大作中提到: 】
: 没有解释IE和Firefox的不同之处啊
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 13:58:32 2008) 提到:
因为 window.baz 不是一个变量声明,所以没有出现。
【 在 lucifor (lucifor) 的大作中提到: 】
: 还有为什么window.baz没有出现在script引擎的全局变量表里面啊
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 14:03:46 2008) 提到:
虽然不是变量声明,但的确是变量定义,存在script作用域里面啊,你把第二段代码里的var baz前面的var去掉,然后在这段代码开头写一下两句
alert(window.baz);
alert(baz);
它们都会正常显示baz的值,在fx和ie下面都是
【 在 modico ().net() 的大作中提到: 】
: 因为 window.baz 不是一个变量声明,所以没有出现。
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 14:08:22 2008) 提到:
第一个alert正常你肯定明白
第二个alert为什么正常呢?因为script引擎在自己的表里找不到时会去找window属性
【 在 lucifor (lucifor) 的大作中提到: 】
: 虽然不是变量声明,但的确是变量定义,存在script作用域里面啊,你把第二段代码里的var baz前面的var去掉,然后在这段代码开头写一下两句
: alert(window.baz);
: alert(baz);
: ...................
☆─────────────────────────────────────☆
xlambda (隐湖之鲤) 于 (Sun Nov 23 14:34:37 2008) 提到:
其实我是问为什么会有这种效果:合在一起就能在给window属性赋值时更新script全局变量,而不合就不更新?
一般而言,可以把js全局变量赞同于window对象。对于这两个对象是否有一些细节上的区别,有没有一些资料可以查阅的?
【 在 modico ().net() 的大作中提到: 】
: 你很仔细啊
: <- 表示给window属性赋值时也会更新script引擎全局变量
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 14:40:23 2008) 提到:
我的理解也是window.a等于js里的全局变量,fx也是这样认为,不过显然ie不是这么想,不知道按照标准应该是啥样子的
【 在 xlambda (隐湖之鲤) 的大作中提到: 】
: 其实我是问为什么会有这种效果:合在一起就能在给window属性赋值时更新script全局变量,而不合就不更新?
: 一般而言,可以把js全局变量赞同于window对象。对于这两个对象是否有一些细节上的区别,有没有一些资料可以查阅的?
☆─────────────────────────────────────☆
sayinger (言者) 于 (Sun Nov 23 15:00:30 2008) 提到:
所谓全局不就是当前window么,显然ie也是这样的,只是在跨block的时候对于出现declare的语句处理有点诡异。
【 在 lucifor (lucifor) 的大作中提到: 】
: 我的理解也是window.a等于js里的全局变量,fx也是这样认为,不过显然ie不是这么想,不知道按照标准应该是啥样子的
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 15:04:54 2008) 提到:
合在一起可以是因为有变量声明在先。
如果一个变量没有声明,在window对象里赋属性值 会/不会 自动在脚本引擎里
补充一个声明,就是两种实现的区别,但这更多的是 window 对象的实现区别。
【 在 xlambda (隐湖之鲤) 的大作中提到: 】
: 其实我是问为什么会有这种效果:合在一起就能在给window属性赋值时更新script全局变量,而不合就不更新?
: 一般而言,可以把js全局变量赞同于window对象。对于这两个对象是否有一些细节上的区别,有没有一些资料可以查阅的?
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 15:19:16 2008) 提到:
【 在 modico ().net() 的大作中提到: 】
: 合在一起可以是因为有变量声明在先。
: 如果一个变量没有声明,在window对象里赋属性值 会/不会 自动在脚本引擎里
: 补充一个声明,就是两种实现的区别,但这更多的是 window 对象的实现区别。
话说上次讨论什么的时候提到了这个来着……
window 对象和全局 scope,js 剩下的最显眼的一个歧义
果然还是容易出问题的……
btw, 确定 ie/fx 扫描 declarations 的过程没有区别?
如果 fx 一开始就扫描了两个 script 的所有 var
也会造成和合并两个 script 标签同样的效果吧
这个我手头没有资料……
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 15:27:22 2008) 提到:
从现象上看还是有区别的
ie会预处理当前scope里的所有declarations
ff把变量声明按一般语句来处理
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 话说上次讨论什么的时候提到了这个来着……
: window 对象和全局 scope,js 剩下的最显眼的一个歧义
: 果然还是容易出问题的……
: ...................
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 16:07:36 2008) 提到:
呃,虽然你解说了这些变量表的变化过程
但你最关键的问题还是没太说明白啊……
我觉得最关键的问题是,什么是全局对象,什么是window对象的属性?这两者是否等价?
为何var blah = "asdf;那么window.blah == "asdf";?
关于这个问题有更权威的解释么,我是指,各浏览器的javascript解释器对window对象的解释?
【 在 modico ().net() 的大作中提到: 】
: 能看到一个不错的问题,我很欣慰。
: 首先,这个问题不可怕。
: 其次,不用bug这个词是谨慎的做法,以后也要这样。
: ...................
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 17:38:13 2008) 提到:
嗯,把那个页面稍微多写了几句辅助记录的代码,
的确可以明显看到window.baz和var baz在第二个script标签里都是undefined了
不过为啥呢?为啥我之前明确的定义了window.baz,现在window.baz又不见了?难道说window对象都变化了?我愈发confused了。。
【 在 modico ().net() 的大作中提到: 】
: 能看到一个不错的问题,我很欣慰。
: 首先,这个问题不可怕。
: 其次,不用bug这个词是谨慎的做法,以后也要这样。
: ...................
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 18:02:34 2008) 提到:
罚你再仔细重读我的re 3遍
【 在 sly9 (-_-b) 的大作中提到: 】
: 嗯,把那个页面稍微多写了几句辅助记录的代码,
: 的确可以明显看到window.baz和var baz在第二个script标签里都是undefined了
: 不过为啥呢?为啥我之前明确的定义了window.baz,现在window.baz又不见了?难道说window对象都变化了?我愈发confused了。。
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 18:13:09 2008) 提到:
modico 的意思基本上就是说,IE 对一个 script 段的处理有以下两个特性:
1. 会预先扫描本段所有全局 var 定义
对每一个定义产生全局变量指向 window 同名属性
然后对该变量赋值 undefined
此过程并不检查 window 是否已有了同名属性值
因此如果原先有值会被覆盖
2. 直接对 window 属性赋值时,并不检查是否已存在同名全局变量
也不会在没有全局变量时自动创建
其结果就是
1. 第一段 script 直接对 window.baz 赋值,但并未产生全局变量 baz
2. 第二段 script 的 var baz 引发了全局变量 baz 的创建
同时造成 window.baz 被重新赋值为 undefined
两个特性随便改掉一个就不会有这个现象了……
所以我刚才说不知道 fx 是哪一条还是两条都跟 IE 不一样
说到底总归就是 全局变量 和 window 属性这俩东西的基本等价搞出来的事儿……
【 在 sly9 (-_-b) 的大作中提到: 】
: 嗯,把那个页面稍微多写了几句辅助记录的代码,
: 的确可以明显看到window.baz和var baz在第二个script标签里都是undefined了
: 不过为啥呢?为啥我之前明确的定义了window.baz,现在window.baz又不见了?难道说window对象都变化了?我愈发confused了。。
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 18:15:45 2008) 提到:
太多了……给个简明扼要的回复吧?
是那个“ie会预处理当前scope里的所有declarations”么?
我觉得不能说明IE没问题啊
1. 的确浏览器都会预处理函数里头的var,但对于非函数里头的,也应该预处理么?我且先保持个疑问……有人去查个ecma-262么。。
2.请注意下面三条:
2.1 我们看到第一个script标签中,有明确的“window.baz = "bazzoom";”
2.2 The Window object defines the following properties and also inherits all the global properties of core JavaScript. (来自javascript the definitive guide 5th)
2.3 It is legal and harmless to declare a variable more than once with the var statement.(也来自同一本书)
根据这三条,我们可以认为,第一个script执行完毕后,window对象,也就是global中已经有了baz;且第二个script标签中的var baz应该是无害的,那么为什么覆盖掉了之前的baz的内容呢?
如果说javascript the definitive guide 5th有问题,麻烦指出在ecma-262里头哪里有更清楚的定义……太长了,懒得搜索了。或者指出IE遵循的具体是什么标准?
【 在 modico ().net() 的大作中提到: 】
: 罚你再仔细重读我的re 3遍
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 18:20:01 2008) 提到:
我主要疑惑的是,IE这么做是遵循了什么标准?还是说标准完全没提及这方面的事儿,所以浏览器自己发挥了?
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: modico 的意思基本上就是说,IE 对一个 script 段的处理有以下两个特性:
: 1. 会预先扫描本段所有全局 var 定义
: 对每一个定义产生全局变量指向 window 同名属性
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 18:52:17 2008) 提到:
找到了。涉及下面三段
ECMA-262
10.1.3 Variable Instantiation
Foreach VariableDeclaration or VariableDeclarationNoIn in the code, create a pro
perty of the variable object whose name is the Identifier in the VariableDeclara
tion or VariableDeclarationNoIn, whose value is undefined and whose attributes a
re determined by the type of code. If there is already a property of the
variable object with the name of a declared variable, the value of the property
and its attributes are not changed.
10.1.5 Global Object
There is a unique global object (15.1), which is created before control enters any execution context. Initially the global object has the following properties:
* Built-in objects such as Math, String, Date, parseInt, etc.
These have attributes.
* Additional host defined properties. This may include a property
whose value is the global object itself; for example, in the HTML
document object model the window property of the global object is
the global object itself.
10.2.1 Global Code
* The scope chain is created and initialised to contain the global
object and no others.
* Variable instantiation is performed using the global object as the
variable object and using property attributes.
* The this value is the global object.
也就是说,首先,window 就是全局对象
同时,作为用来保存当前 scope 变量的 "variable object"
window 的属性就是全局变量,这两者之间没有歧义,完全是等价的
IE 创建 baz 变量时覆盖 window.baz 原有值违反了第一条
设置 window 属性时不更新全局变量表违反了第三条……
应该可以视作 bug 了。
另:从第一条看来,在 script 一开始扫描 var 定义倒是应该对的
【 在 sly9 (-_-b) 的大作中提到: 】
: 我主要疑惑的是,IE这么做是遵循了什么标准?还是说标准完全没提及这方面的事儿,所以浏览器自己发挥了?
☆─────────────────────────────────────☆
FeiYue (飞跃) 于 (Sun Nov 23 19:09:33 2008) 提到:
这个解释好
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 标 题: Re: IE的js解释。。
: 发信站: 水木社区 (Sun Nov 23 18:52:17 2008), 站内
:
: 找到了。涉及下面三段
:
: ECMA-262
:
: 10.1.3 Variable Instantiation
:
: Foreach VariableDeclaration or VariableDeclarationNoIn in the code, create a pro
: perty of the variable object whose name is the Identifier in the VariableDeclara
: tion or VariableDeclarationNoIn, whose value is undefined and whose attributes a
: re determined by the type of code. If there is already a property of the
: variable object with the name of a declared variable, the value of the property
: and its attributes are not changed.
:
: 10.1.5 Global Object
:
: There is a unique global object (15.1), which is created before control enters any execution context. Initially the global object has the following properties:
: * Built-in objects such as Math, String, Date, parseInt, etc.
: These have attributes.
: * Additional host defined properties. This may include a property
: whose value is the global object itself; for example, in the HTML
: document object model the window property of the global object is
: the global object itself.
:
: 10.2.1 Global Code
:
: * The scope chain is created and initialised to contain the global
: object and no others.
: * Variable instantiation is performed using the global object as the
: variable object and using property attributes.
: * The this value is the global object.
:
: 也就是说,首先,window 就是全局对象
: 同时,作为用来保存当前 scope 变量的 "variable object"
: window 的属性就是全局变量,这两者之间没有歧义,完全是等价的
:
: IE 创建 baz 变量时覆盖 window.baz 原有值违反了第一条
: 设置 window 属性时不更新全局变量表违反了第三条……
:
: 应该可以视作 bug 了。
:
: 另:从第一条看来,在 script 一开始扫描 var 定义倒是应该对的
:
: 【 在 sly9 (-_-b) 的大作中提到: 】
: : 我主要疑惑的是,IE这么做是遵循了什么标准?还是说标准完全没提及这方面的事儿,所以浏览器自己发挥了?
:
:
: --
: 在一片喊杀声中,出现在佳花与祥琼面前的是惠侯月溪。
:
: “出列于朝上的大人,只是当众挖鼻孔,就要被处死吗?只因为上朝前没刷牙,或者是吃了大蒜也是死罪。还有上厕所后不洗手,起床后不洗脸,一个星期不洗澡……只要主上不喜欢的事,都是死罪。你们现在的恐惧更本不能和人民所经历的恐惧相提并论。”
:
: 峰王·仲鞑由于精神洁癖而失道,谥号“洌王”。
:
:
: ※ 修改:·withinsea 于 Nov 23 19:01:27 2008 修改本文·[FROM: 123.122.115.9]
: ※ 来源:·水木社区 newsmth.net·[FROM: 123.122.115.9]
☆─────────────────────────────────────☆
Nefarius (关er) 于 (Sun Nov 23 19:16:43 2008) 提到:
2. 直接对 window 属性赋值时,并不检查是否已存在同名全局变量
也不会在没有全局变量时自动创建
<script>
window.x = 1
alert(x)
</script>
这个呢
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: modico 的意思基本上就是说,IE 对一个 script 段的处理有以下两个特性:
: 1. 会预先扫描本段所有全局 var 定义
: 对每一个定义产生全局变量指向 window 同名属性
: ...................
☆─────────────────────────────────────☆
Nefarius (关er) 于 (Sun Nov 23 19:20:30 2008) 提到:
关于多个script标签在标准里有啥规定没
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 找到了。涉及下面三段
: ECMA-262
: 10.1.3 Variable Instantiation
: ...................
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 19:24:39 2008) 提到:
版主快来摸一个
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 找到了。涉及下面三段
: ECMA-262
: 10.1.3 Variable Instantiation
: ...................
☆─────────────────────────────────────☆
Kommit (小七 - 无房无车已婚正太) 于 (Sun Nov 23 19:35:51 2008) 提到:
摸摸
【 在 sly9 (-_-b) 的大作中提到: 】
: 版主快来摸一个
☆─────────────────────────────────────☆
ttl (小驴|主ID) 于 (Sun Nov 23 19:39:14 2008) 提到:
人肉搜索啊~~~~
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 找到了。涉及下面三段
: ECMA-262
: 10.1.3 Variable Instantiation
: ...................
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 20:32:00 2008) 提到:
从实现的角度看,要把脚本的全局对象和一个宿主对象等同起来是困难的,
书生意气啊,所以最多也就是语义上尽量等同。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 找到了。涉及下面三段
: ECMA-262
: 10.1.3 Variable Instantiation
: ...................
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 20:47:28 2008) 提到:
困难不困难它都实现的错了。。
【 在 modico ().net() 的大作中提到: 】
: 从实现的角度看,要把脚本的全局对象和一个宿主对象等同起来是困难的,
: 书生意气啊,所以最多也就是语义上尽量等同。
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 20:50:25 2008) 提到:
可能你并不具合适的资格说它实现错了
【 在 sly9 (-_-b) 的大作中提到: 】
: 困难不困难它都实现的错了。。
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Sun Nov 23 20:51:20 2008) 提到:
请教什么算合适的资格,您这样的资格?
错了的东西就是错了,别不好意思承认。又不是说你实现的错了,说的是IE
【 在 modico ().net() 的大作中提到: 】
: 可能你并不具合适的资格说它实现错了
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 20:53:45 2008) 提到:
唉,为什么一个不错的开头总有一个很烂的结尾呢
【 在 sly9 (-_-b) 的大作中提到: 】
: 请教什么算合适的资格,您这样的资格?
: 错了的东西就是错了,别不好意思承认。又不是说你实现的错了,说的是IE
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 21:03:35 2008) 提到:
【 在 modico ().net() 的大作中提到: 】
: 从实现的角度看,要把脚本的全局对象和一个宿主对象等同起来是困难的,
也没有吧
每一个 closure 都有这样的一个宿主对象,这个宿主对象的实现应该没什么区别
window 特殊也就只是特殊在它是唯一可见的……
: 书生意气啊,所以最多也就是语义上尽量等同。
实现本身是不是等价确实无所谓
ie 分变量表和window对象两边记录其实看作一种实现也没什么问题
但就是因为少了 window.baz 赋值时创建全局变量的这一步
两者的语义上就有区别了
既然看不出 ie 是要故意依据与标准不同的规则以达到某种特殊效果
那么这看作一个错误实现我想是没什么问题的
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 21:27:20 2008) 提到:
脚本引擎不只用于浏览器,DOM对象也不止一种语言操作它,它有什么义务要照顾
某一种语言?既然js标准里说要照顾到宿主,那么实现的时候同步全局变量的
义务在脚本,而DOM标准里没说要照顾到某种语言,那么实现的时候就没有同步
window属性到脚本全局变量的义务。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 也没有吧
: 每一个 closure 都有这样的一个宿主对象,这个宿主对象的实现应该没什么区别
: window 特殊也就只是特殊在它是唯一可见的……
: ...................
☆─────────────────────────────────────☆
SkyU (天的那一边) 于 (Sun Nov 23 21:31:05 2008) 提到:
sly9提的挺正确的,微软的确实现的很烂.
【 在 modico ().net() 的大作中提到: 】
: 唉,为什么一个不错的开头总有一个很烂的结尾呢
☆─────────────────────────────────────☆
lucifor (lucifor) 于 (Sun Nov 23 21:33:34 2008) 提到:
ie不符合标准的地方多了去了,为什么要把它的实现当作标准并捍卫它呢?
【 在 modico ().net() 的大作中提到: 】
: 脚本引擎不只用于浏览器,DOM对象也不止一种语言操作它,它有什么义务要照顾
: 某一种语言?既然js标准里说要照顾到宿主,那么实现的时候同步全局变量的
: 义务在脚本,而DOM标准里没说要照顾到某种语言,那么实现的时候就没有同步
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 21:35:22 2008) 提到:
你把 window 写在 <script type="text/javascript"> 下面
它就不只是 dom 对象,也是 js 对象了。当然必须遵守 js 标准。
【 在 modico ().net() 的大作中提到: 】
: 脚本引擎不只用于浏览器,DOM对象也不止一种语言操作它,它有什么义务要照顾
: 某一种语言?既然js标准里说要照顾到宿主,那么实现的时候同步全局变量的
: 义务在脚本,而DOM标准里没说要照顾到某种语言,那么实现的时候就没有同步
错了,即使不在 dom,那也不在脚本,在脚本引擎才对。
: window属性到脚本全局变量的义务。
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 21:39:32 2008) 提到:
捍卫?你是说捍卫?这个词太有政治热情了。
我没什么立场,用不着说谁的好话,也没资格说谁的错。
【 在 lucifor (lucifor) 的大作中提到: 】
: ie不符合标准的地方多了去了,为什么要把它的实现当作标准并捍卫它呢?
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 21:40:54 2008) 提到:
js 对象和 js 可以操作的对象还是有区别的
所以你的这一观点我不敢苟同。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 你把 window 写在 <script type="text/javascript"> 下面
: 它就不只是 dom 对象,也是 js 对象了。当然必须遵守 js 标准。
: 错了,即使不在 dom,那也不在脚本,在脚本引擎才对。
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 21:43:45 2008) 提到:
我可没说没区别,当然不是所有 js 对象都是 dom 对象
但你要说 window 只是 dom 对象,不是 js 对象
那我也是不敢苟同的
【 在 modico ().net() 的大作中提到: 】
: js 对象和 js 可以操作的对象还是有区别的
: 所以你的这一观点我不敢苟同。
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 21:50:36 2008) 提到:
其实 window 不是 dom 对象...
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 我可没说没区别,当然不是所有 js 对象都是 dom 对象
: 但你要说 window 只是 dom 对象,不是 js 对象
: 那我也是不敢苟同的
: ...................
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 21:52:21 2008) 提到:
……这算是掉坑里了么……
【 在 modico ().net() 的大作中提到: 】
: 其实 window 不是 dom 对象...
☆─────────────────────────────────────☆
modico ().net() 于 (Sun Nov 23 21:54:04 2008) 提到:
我不是故意的
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: ……这算是掉坑里了么……
☆─────────────────────────────────────☆
withinsea (沐海~魔導奏器|歌の琴フォルテール) 于 (Sun Nov 23 21:54:32 2008) 提到:
咳……
【 在 modico ().net() 的大作中提到: 】
: 我不是故意的
修改:withinsea FROM 123.122.115.9
FROM 123.122.115.9