1、( . )点操做符 与( [ ] ) 方括号操做符函数
(一)( . )点操做符spa
var earth = person.name; //获得person对象的name属性
点操做符的右侧是一个以属性名称命名的标识符,标识符是静态的。code
(二) [ ] 方括号操做符对象
var earth = person['age']; //获得person对象的age属性
方括号操做符的内部是一个返回结果为字符串的表达式,该字符串就是属性的名字。严格来讲表达式必须返回字符串或一个能够转换为字符串的值。blog
因为字符串值是动态的,因此能够再运行时更改。作用域
2、变量、函数做用域及做用域链字符串
(一)变量做用域io
变量的做用域取决于定义变量的位置,就像在全局中定义的变量,那他的做用域就是全局做用域。若是一个变量在函数内定义,那么这个变量就是局部做用域,做用于这个函数体内,值得一提的是函数的参数也属于局部变量。console
(二)函数做用域function
函数的做用域指在该函数体内声明的变量,在该函数体内是始终能够看见的。
介于定义的函数方式有两种,一种是函数声明,一种是函数表达式。这里对函数声明的定义方式进行说明。
函数声明有一个很重要的特征,那就是函数声明提高、函数内的变量声明提早。
var scope = 'global';
origin();
function origin(){ console.log(scope); var scope = 'local'; console.log(scope); }
函数声明提高指的是在执行代码前,会先读取函数声明,因此把调用它的语句放在函数前面也依然能够获得执行。
函数声明提早指的是在函数内,会将全部的变量声明提早到函数内的最上部,但只是此时的变量只是声明了,并未赋值。
执行函数时,在origin函数内的第一个console.log会打印undefined,这是由于scope变量的声明提到了console.log前,但未赋值,因此显示undefined。只有真正执行到了变量所在行时,才会为其赋值,因此第二个console.log会打印出‘local’(声明了一个全局变量scope,在函数内部也声明了一个局部变量scope。在函数执行时,遇到两个同名的变量,局部变量就会覆盖全局变量)。
(三)做用域链
函数的做用域链有两种状态,一种是函数定义时,一种是调用函数时。
表示变量的对象被称为变量对象。
函数定义时,会建立一个包含全局变量对象(全局对象)的做用域链,这个做用域链被保存在函数的内部属性[[scope]]中。
当函数被调用时,就会建立一个执行环境,将该函数内的arguments属性和参数放入活动对象内(局部对象),此时这个活动对象位于做用域链的第一个,再将包含该函数的外部函数的全局变量对象放在做用域链的第二个。因此这就是为何在函数内部就能够访问到函数外部变量的缘由,以下图。