您的位置:首页 > Web前端 > JavaScript

Javascript作用域学习笔记

2016-10-06 15:13 369 查看
一、学习笔记:

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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: