一.作用域
表示变量或函数起作用的区域,指代了它们在什么上下文中执行,Javascript总作用域一共有两种:全局作用域和本地作用域,在Javascript中本地作用域是按照函数来区分的。
var global = "11"; //全局作用域 function fun() { var local = "22";//本地作用域1 } function fun2() { var local2 = "22";//本地作用域2 for (var i=0;i<100;i++) { //本地作用域2 } }
JavaScript的作用域和C#的或者Java的作用域不是太一样,C#和Java中一个"{}"就是一个作用域,而JavaScript本地作用域是用函数来区分的;全局作用域是以window对象来区分的。
二.作用域链
与"“原型链”类似,Javascript的作用域链也是按有顺序查询的。在访问变量时,先查看本地作用域是否有此变量,如果没有则依次向上一级作用域查找直到全局作用域。如果全局作用域也没有此变量,那么将会返回“undefined”。
function A() { name = "全局变量"; this.local = "局部变量"; } var a = new A(); alert(name);//全局变量 alert(a.local);//局部变量 alert(a.age);//undefined
三.闭包
表示能访问和操作其他内部作用域的变量的表达式(通常是函数)。用简单的语言描述就是:能操作其他本地作用域变量的函数就是闭包。还是看代码:
function fun() { var i = 1; return function() { i++; console.log(i); } } var closure = fun(); closure(); //2 closure(); //3
请先按Java语言或其他非闭包语言的逻辑思考。当fun函数执行完毕时,其内部变量i应该会被释放,当closure函数再此执行并调用i时输出错误(因为i未被声明)。但是在Javascript中却打印出了值,这一切都归功于闭包。在执行fun()函数时,闭包就被创建。此时i并没有被释放,closure依然可以被访问到。
另外注意闭包的本质是表达式(通常是函数),所以闭包是在函数生成时定义的。(上面代码的第3行定义闭包)!
四.闭包的作用
闭包最大的作用就是来阻止外部程序随意访问内部变量,只能通过提供的接口来访问和操作。如下面一个记数器的实现:
var counter = (function() { var i=0; return { add:function() { i++; return this; }, get:function() { return i; } } })(); counter.add().add().add(); console.log(counter.get()); //3
如果不用闭包直接暴露变量,那就会出现如下的情况产生bug:
i=0; function add() { i++; } add(); add(); i+="1"; add(); console.log(i);//22
五.上下文
又可以理解为上下文对象,表示当前代码执行时所处的环境。即是this变量所指代的对象;这么理解比较困难,直接看个例子:
function Test() { console.log(this); } Test(); //window new Test();//Object
在执行Test()时,此时的上下文对象是window,即Javascript的全局对象!在执行new Test();时新建了一个Object,此时执行Test函数的上下文对象就是Object。
本文参网上搜索的内容,如有侵权,请联系我。