Javascript作用域学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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作用域学习笔记的主要内容,如果未能解决你的问题,请参考以下文章