第七章 作用域和闭包

来源:互联网 发布:淘宝女士秋季连衣裙 编辑:程序博客网 时间:2024/04/29 11:13

7.1 JavaScript作用域概要

在JavaScript中,作用域是执行代码的上下文。作用域有三种类型:全局作用域、局部作用域(有时被称为“函数作用域”)和eval作用域。
在函数内部使用var定义的代码,其作用是局部的,且只对该函数的其它表达式是“可见的”,包含嵌套/子函数的代码。在全局作用域内定义的变量从任何地方都可以访问,因为它是作用域链中的最高层/最后一个。

var foo = 0;console.log(foo);var muFuncion = function(){    var foo = 1;    console.log(foo);//1    var myNestedFuntion = function()    {        var foo = 2;        console.log(foo);//2    }();}();eval('var foo = 3; console.log(foo);');

! 包含函数的函数,会创建堆栈执行作用域。这些链接在一起的栈通常被称为作用域链。

7.2 JavaScript没有块作用域

由于逻辑语句(如if(){})和循环语句(如for)无法创建作用域,因此变量可以相互覆盖。

7.3 在函数中用var声明变量,避免作用域陷阱

JavaScript会将缺少var的变量声明(即便是在函数或者封装的函数中),声明在全局作用域中,而非局部作用域。

var foo = function(){    bar = 2;    var ch = 1;};console.log(bar);    //2console.log(ch);    //undefined

7.4 作用域链

在JavaScript查找与变量相关的值时,会遵循一个查找链。

7.5 作用域链查找返回第一轮值

当在作用链内最近位置查找到变量时,查找即结束。

7.6 函数定义时确定作用域,而非调用时确定

7.7 函数是由作用域链引起的

var countUpFromZero = function(){    var count = 0;    return function(){        return ++count;    };}();console.log(countUpFromZero());//1console.log(countUpFromZero());//2console.log(countUpFromZero());//3

http://jibbering.com/faq/notes/closures/

0 0