这是一个模拟聊天的简单应用程序。我提供jsfiddle:
http://jsfiddle.net/LkqTU/2785/
一些来自服务器的消息,由按钮模拟,用户在绑定到 keypress 事件的 textarea 上键入以获取输入键并发送消息。
好吧,这在 Chrome 和 Firefox 中运行良好,但在 IE9 中失败。
有什么问题?
谢谢
这是一个模拟聊天的简单应用程序。我提供jsfiddle:
http://jsfiddle.net/LkqTU/2785/
一些来自服务器的消息,由按钮模拟,用户在绑定到 keypress 事件的 textarea 上键入以获取输入键并发送消息。
好吧,这在 Chrome 和 Firefox 中运行良好,但在 IE9 中失败。
有什么问题?
谢谢
好吧,找到错误相对容易:分配this
给在模型函数开头命名的外部变量self
看起来不正确。
然而,为什么它在 Chrome 和 Firefox 中运行良好,但在 IE 中失败的解释更有趣。显然 varlessself
指的是window.self
,这实际上是window
对象的特殊属性 - 对...window
本身的引用(MDN)。
Internet Explorer 实际上以其对该属性的特殊处理而闻名:而在其他浏览器中window === window.self
计算为true
,在 IE 中为false
. 我不会说 IE 没有任何理由就这样做了。检查此讨论以获取一些详细信息。
具有讽刺意味的是,在这个特殊的例子中,IE 变成了一个半英雄。) 我说的是“英雄”,因为 IE 是唯一不让你覆盖的浏览器window.self
。其他的都没有那么挑剔;添加console.log(window.self)
到脚本的末尾以见证他们的耻辱。)
我说的是“一半”,因为 IE 可能会更加……英勇。) 而不是默默地忽略window.self = ...
行(并以稍微不同的方式使用被忽略的赋值的那条遥远的行抛出错误),为什么 IE 不只是给出早期警告?该死的,即使是通知也可以。
反正。在这些事情上不要依赖 IE 的零星英雄主义是很容易的:只需'use strict'
在脚本的开头添加一行,瞧!self = this
Chrome 和 Firefox 都会在它所属的地方——在line处吐出一个“参考错误”警告。)
是的,我知道“使用严格”使用不是一个简单的步骤,它可能会破坏一些脚本;但我完全支持 Nicholas Zakas关于该主题的声明。