学习javascript中的细节总结

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属性和参数放入活动对象内(局部对象),此时这个活动对象位于做用域链的第一个,再将包含该函数的外部函数的全局变量对象放在做用域链的第二个。因此这就是为何在函数内部就能够访问到函数外部变量的缘由,以下图。

相关文章
相关标签/搜索