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作用域学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript作用域学习笔记

JavaScript作用域学习笔记

你不知道的JavaScript学习笔记1——作用域

《你不知道的 JavaScript 上卷》 学习笔记

JavaScript学习笔记

JavaScript学习笔记——闭包