首先要明确什么是JS。各位读者肯定都是在学习和研究JS的,或是菜鸟或是大牛,但是你考虑过什么是JS吗?乍一看来我这问题有点死抠字眼的味道,但在学习一门语言的时候就必须有这种打破沙锅问到底的精神。只有这样才能学得深入,才能学到这门语言的本质。几句絮叨之后,我们回到之前的问题——什么是JS?我们挂在嘴边的JS实际上有两种含义——一,ECMAScript,也就是所谓的JS标准;二,宿主环境中的JS,因为JS基本上是用于web开发的(JS官方称JS为"language of the web"),所以实际上也就是各大浏览器环境中的JS。既然有两种JS,那这道题自然也就有两种答案了。
一、ECMAScript。
有些文章里说ECMAScript所谓的全局函数和内置对象的函数或属性是不同的概念,全局函数是不属于任何对象的。我认为这种说法是错误的,但同时也是正确的。先说它错误的一面。按照ECMAScript5标准,全局函数也是内置对象的属性,这个内置对象就是所谓的全局对象(The Global Object)。标准原文解释说,"The unique global object is created before controls enters execution context"。这里就引出了全局对象的第一个特点——独一无二,也就是说你不可能用某种构造函数再创建一个全局对象出来。 好了,我们已经明确了全局函数是全局对象的属性,也就说明了前面那句话的错误性。那我为什么又说它也是正确的呢?因为标准里面一提到全局对象就用“The Global Object”,这个独一无二的全局对象连个变量名都没有,是个只知其人不知其名的家伙,因此我们永远都不可能在代码里面直接用这个家伙,那忽略这个对象的存在又有何妨呢?所以我说前面那句话也有一定的正确性。
OK,接下来我们来研究究竟有哪些全局函数/属性(很多地方就这个问题给了个看似完整的列表,但实际上都不完整,下面我们就完全按照ECMAScript5标准来解释这个问题)。
1. 值属性
1.1 NaN
NaN属性的值是NaN。
1.2 Infinity
Infinity属性的值是+∞。
1.3 undefined
undefined属性的值是undefined。
这三个属性是干嘛用的呢——嘛都不干,至少我觉得没毛用,标准里也是一句话带过,存在感太低。
2. 函数属性
2.1 一般函数
2.1.1 eval(x)
如果x是不是字符串,直接返回x本身;如果x是字符串,则将这个字符串解析为一段ECMAScript代码(如果无法正确解析,抛出错误),然后为这段代码新建一个执行环境并执行这段代码,最后返回执行结果。
2.1.2 parseInt(string,radix)
关于这个函数有很多可以说的,限于篇幅这里只提两点:一,parseInt(‘‘)和parseInt(‘null‘)均返回NaN;二,在JS解析器自动执行强制转型时,执行的是Number()函数而不是parseInt()。
2.1.3 parseFloat(string)
和parseInt()最明显的差别就是没有radix参数,也就是说parseFloat()只能按十进制进行数字转换。
2.1.4 isNaN(number)
2.1.5 isInfinity(number)
上面两个函数只要记住才对number尽心强制转型的时候调用的是Number()。
2.2 处理URI的函数
2.2.1 decodeURI(encodedURI)
2.2.2 decodeURIComponent(encodedURIComponent)
2.2.3 encodeURI(uri)
2.2.4 encodeComponent(uriComponent)
JS对URI的处理也不是三言两语就能说清楚的问题,这里就不叙述了,留待日后详细研究。
2.3 构造函数
这里就是JS内置类型的构造函数了,它们也都是全局函数,每一个都值得深入探讨,这里只做一个简单罗列:
Object() Function() Array() String() Boolean() Number() Date() RegExp() Error() EvalError() RangeError() ReferenceError() SyntaxError() TypeError() URIError()
2.4 其他属性
其他还有两个:Math和JSON,想必也是耳熟能详的两个家伙,具体研究也就留待日后了。
好了,到这里一切就很清楚了。按ECMAScript5的标准,如果除去那一大堆构造函数以外,全局函数共有九个,分别是:eval() parseInt() parseFloat() isNaN() isInfinite() decodeURI() decodeURIComponent() encodeURI() encodeURIComponent()。
OK,ECMAScript5的全局函数到此讲完。
二、浏览器中的JS
浏览器中的JS是ECMAScript标准的具体实现,它不仅基本符合ECMAScript标准,而且添加了许多在标准之外但有十分有用的特性(这些特性估计早晚也会成为标准的一部分)。就全局对象而言,前面我们说过,在ECMAScript标准的表述中,它是没有名字的,但浏览器给它起了名字——window,用于代表浏览器访问网页的web窗口,想必大家也是耳熟能详。在浏览器中,一切全局函数和变量都是作为window的属性而存在的(window本身也是window的属性,属性值还是window)。window除了具备上面所提到的ECMAScript标准中要求实现的所有属性之外,还添加了N多属性(打开谷歌,按下F12,点击console面板,输入 window. ,出来的那一大堆提示项就是全局属性啦)。这N多属性里面又有N多函数属性,要想一下讲完恐怕得讲个三天三夜了,下面罗列一些我个人认为比较常用的并就此结束此文。
moveTo() moveBy() resizeTo() resizeBy() open() setTimeout() setInterval() alert() confirm() prompt() console.log()