首页 > 代码库 > Javascript作用域学习笔记

Javascript作用域学习笔记

一、学习笔记:

  1、javascript中的作用域和作用域链

    +  每个函数在被调用时都会创建一个自己的执行环境(作用域),javascript中一切皆为对象,函数也是一个对象;函数对象和其他对象一样,拥有通过代码访问的属性和仅供javascript引擎访问的内部属性。其中一个内部属性就是[[scope]],它是函数在被定义时就创建的,它包含了

函数被创建的作用域中对象的集合。这个集合被称为函数的作用域链,作用域链决定了哪些数据可以被函数访问到。

      作用域链的前端始终都是当前执行的代码所在的环境中的变量对象(作用域链的前端是一个活动对象,当函数被调用时会创建这个活动对象,这个活动对象由函数中的局部变量、命名参数、参数集合、this组成),在函数中查询标识符时都是从这个作用域的前端开始逆向查找。

 

  2、 javascript的预编译

    + Js执行过程是一次翻译执行的过程,Js中也有编译的过程,JS在执行每一段JS代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式).也就是说会将它们的声明提前,但是函数表达式的声明是不能提前的,函数表达式是在执行的时候才计算的。

 

  3、减少全局变量的使用

     因为全局变量总是在作用域链的最末端,所以查找起来是最慢的。一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使 用.(例如:在dom操作中经常要使用的document,可以先将document存在一个局部变量里面)

   

  4、 javascript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.

 

二、 代码验证

 

var name = "youyi";function getName() {	//函数在被执行之前会先创建一个活动对象,	//js先会预编译var关键字,也就是说会将name变量声明提前	alert(name);//undefined	var name = "hello";}getName();//函数运行在函数被定义时的作用域里,而不是运行时的作用域里function factory() {   var username = ‘laruence‘;     var intro = function(){          alert(‘I am ‘ + username);// I am laruence     }     return intro;} function app(para){     var username = para;     var func = factory();     func();}app("hahaha");

 

Javascript作用域学习笔记