一、作用域
作用域是在JS编程中必须要理解和具备的,作用域决定了变量和函数是否有权力去访问哪些数据。在Web浏览器中,全局执行环境是window对象,这也意味着所有的全局变量或者方法都是window对象的属性或方法。当一个函数在被调用的时候都会创建自己的执行环境,而这个函数中所写的代码就开始进入这个函数的执行环境,于是由变量对象构建起了一个作用域链。
var lol = ‘英雄联盟‘; var message = function(){ var _lol = ‘123‘; }
在这个例子中全局环境中包含了两个对象(全局环境的变量对象不算),window.lol和window.message,而这个message函数中又包含了两个对象,它自己的变量对象(其中定义了arguments对象)和全局环境的变量对象。当这个函数开始执行时,message自己的变量对象中定义了_lol,而它的全局环境的变量对象有lol,假设在message中alert一下lol,实际上是message中包含的全局环境的变量对象.lol,于是可以访问。
var lol = ‘123‘; var message = function(){ var lol = ‘456‘; }
如果执行message函数alert一下lol,它的作用域是这样开始搜索的,先搜索message自己的变量对象中是否存在lol,如果有就访问并且立马停止搜索,如果没有则继续往上访问它,有lol,则访问并且立马停止搜索,以此类推一直搜索到全局环境上的变量对象,如果这里都没,那么就要报错了。
var c = ‘123‘; var message = function(){ var g = ‘123‘; var a = function(){ var d = ‘123‘; } }
在这个例子中包含有三个执行环境,全局环境,message的环境,a的环境。从这里可以看出message自身包含两个对象,自己的变量对象和全局环境中的变量对象,而函数a则包含了三个,自身的变量对象,message的变量对象和全局变量对象。
当开始执行这个函数时,在函数a中可以访问到变量g,那是因为函数a包含了message的变量对象,于是在自身没有开始搜索上一级的变量对象时发现了,于是可以访问。那么访问c的原理也是如此,当自身和上一级的message的变量对象都没有,但是全局变量对象中存在,于是访问成功。
了解这个作用域,对于Js编程是至关重要的,不然可能会出现,明明想要的预期结果是123,但是变成了456,为什么?那就是因为一级一级的搜索,可能会存在覆盖,或者搜索到别的地方就立即停止搜索了。
二、引用类型
引用类型虽然看起来和类很相似,但是它们却是不同的概念,引用类型的值,也就是对象是引用类型的一个实例。在Js中引用类型主要有Object,Array,Date,正则,Function等。
Array
在Js中数组可以存储任意的数据。创建数组可以使用构造函数的方式也可以使用字面量的形式,另外可以使用concat从一个数组中复制一个副本出来。数组本身提供了很多方法让开发者使用来操作数组。
Date
时间对象也是使用非常多的玩意,它是使用GMT时间来描述,而且时间对象是可以直接比对大小的。
var date1 = new Date(2015,1,2); var date2 = new Date(2015,1,10); date1 < date2
常用的方法
上面看起来都是获取,当然也有设置,只是相应的get置换成set即可。
正则表达式
在Js里正则表达式是用RegExp类型来支持的。
一般来说很少有人这么使用var xxx = new RegExp(),而是用字面量的方式,比如var xx = /[bc]/gi;像用的比较多的方法有exec用于捕获包含第一个匹配项的数组,没有则返回null。test,用于判断,如果匹配返回true,不匹配返回false。
字符串
js处理字符串有以下方法可以使用
三、函数
函数主要有以下几个概念
匿名函数和闭包
匿名函数又叫拉姆达函数,主要是在把函数当值传递的时候用,或者是把函数当返回值,比如:
1 function d(callback){ 2 callback(); 3 } 4 d(function(){ 5 alert(‘123‘) 6 }); 7 //或者 8 function b(){ 9 return function(){ 10 alert(‘123‘); 11 } 12 } 13 var g = b(); g();
其实第二种方式跟闭包的意义一样了,所谓的闭包书面的解释是可以访问另一个函数作用域内变量的函数,稍微改写一下可能会更明显。
1 function b(){ 2 var name = ‘123‘; return function(){ 3 alert(name); 4 } 5 } 6 var g = b(); g();
从这里可以看出来return的函数可以访问到name,而外部却不行,这个返回值的函数就可以理解为闭包。理解闭包还可以看一个经典的求值的例子。
原文:http://www.cnblogs.com/dabai-/p/6010736.html