作用域
作用域空间那个值变量和参数的可见性和生命周期,对程序员来说很重要,因为它减少了命名冲突,并且提供了自动内存管理。
JavaScript没有块级作用域,却有函数作用域:定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中任何地方都可见。
下面这个例子与以对象字面量初始化对象不同,通过调用一个函数形式去初始化对象,返回一个对象字面量。此函数定义了一个 val 变量,该变量对 addVal 和 getVal 总是可用的,但函数的作用域使得其对其他程序来说是不可见的。
联想到之前我做的一个小游戏,是20秒内完成任务,使用 restTime 做倒计时变量。后来同事把restTime修改了,成绩贼高。最后我就是用这种办法把 restTime像 val 一样隐藏了起来。
闭包
作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量(除了this和arguments)。
当调用 o 时,返回一个包含addVal和getVal的新对象,该对象的引用保存在 oo 中。虽然 o 返回了,但是 oo 的addVal和getVal有访问 val 的特权,它们可以访问被创建时所处的上下文,这就是闭包。
模块
可以使用函数和闭包来构造模块。递归 2次调用模块是一个提供接口却隐藏状态与实现的函数或对象。
具体见『作用域』部分-模块模式
三、继承
当一个函数对象被创建时,Function 构造器产生的函数对象会运行类似这样的代码:
this.prototype = {constructor: this}
每个函数都会得到一个 prototype 对象,其值是包含一个 constructor 属性且属性值为该新函数对象。该 prototype 对象是存放继承特征的地方。
四、数组
区分数组和对象
一个常见的错误是在须使用数组时使用了对象,在须使用对象时使用了数组。其实规则很简单:当属性名是小而连续的整数时,用数组,否则就用对象。
JavaScript中数组 typeof 返回是 object,这并不能区分数组和对象。
首先,我们判断这个值是否为真,我们不接受 null 和其他为假的值。
其次,我们判断这个值的 typeof 运算结果是否是 object 。对于对象、数组和null来说,将得到 true。
第三,我们判断这个值是否有一个值为数字的 length 属性,对于数组是 true ,对于对象则为 false
第四,判断这个值是否包含一个 splice 方法。对于数组,返回 true
最后,我们判断 length 属性是否是可枚举的
这真的很复杂,实际上,我一直是这样用的,什么类型都能检测,堪称万能:
五、方法
Array
concat(item...)
返回一个新数组,并不会修改原数组
join(separator)
把一个 array 构造成一个字符串,并用 separator 作为分隔符把它们连接在一起。
pop(item...)
移除数组中最后一个元素并返回该元素
push(item...)
将一个或多个元素添加到数组尾部,会修改原数组
reverse()
反转数组中元素的顺序,会修改原数组,返回当前数组
shift()
移除数组中第一个元素
slice(start,end)
从start开始,到end为止(不包括end,可选,默认值是length)复制数组
sort(comparefn)
对数组中的内容排序,并不能给数字排序,因为默认比较函数是假定要被排序的元素都是字符串。
比较函数接受两个参数,并且如果两个参数相等返回0,如果第一个参数应该排在前面,则返回一个负数,如果第二个参数应该排在前面,则返回一个正数。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-86522-3.html