Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

计时器方法的归属

  在贴吧上看到个关于setTimeout的问题,觉得说说这个玩意儿还是很有必要。计时器方法的功能大家都会用,但是仅仅是会用而已,很多人都不知道它们到底是什么。只是把它们当做JavaScript的内置函数来使用了,这样不搞清来龙去脉就使用迟早会出问题。
  到ECMA262里去翻,你会发现找不到关于setTimeout和setInterval这些东西的说明。如果你是用Windows操作系统,可以新建个*.js的文件在WSH(Windows Script Host)下运行,里面也无法使用setTimeout和setInterval这些东西。甚至去谷歌下载V8引擎的源码,在里面也找不到关于计时器方法的任何定义。没错,它们本来就不是原生JavaScript的东西,而是浏览器window对象的东西。
  计时器方法是定义在W3C的Windows对象文档中的。你可以在NodeJS的源码中找到定义。虽然NodeJS没有使用window对象,但是它的各种操作也需要用到计时器的功能,所以它模仿window的计时器方法对这个做了封装。或者你可以在Chromium的源码中找到定义,不过Chromium的源码太复杂了,看起来吃力。
  其实只要搞明白一个概念就好,计时器是在window上注册了一个事件,和addEventListener的工作类似。当设置的时间到时会产生一个计时器事件。当JavaScript处理这个事件时,注册的相应动作就会被执行。具体的事件工作原理可以看之前的文章“JavaScript的消息机制”。
  既然知道了它是一个事件,当然就有了事件的特性。你不需要纠结回调函数中的this指向什么。既然它是一个事件,this当然是指向绑定事件的对象。这个计时器事件是绑定在window上的,所以this自然是指向window的。注意是指向window的,而不是空指针的。也许你会不以为然,空指针不就是指向window吗?有区别吗?其实我一直也觉得没啥区别,但是贴吧上那个问题是使用JavaScript严格模式的,而严格模式下空指针不会被解析到window上。如果是空指针,这里就无法访问this。所以应该明白我在这里特别强调这个事件回调中的this指向window的意义了吧?虽然平时没啥区别= =。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^