首页 > 代码库 > 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作用域学习笔记