If you can do something better ,Why not?
作用域(scope)
作用域在JavaScript内存管理中起着至关重要的作用;能够形成作用域的有函数的调用 with语句(有时间要看看with) 和全局作用域。
var foo = function(){
var local = {};//局部变量
};
foo();//当执行完这个函数之后 local变量会被销毁
console.log(local); //=>undefined
var bar = function(){
local = {};//全局变量 少使用全局变量
};
bar();
console.log(local); //=>{}
在foo()函数中,我们使用var 语句来声明定义一个local变量,二因为函数体内部会形成一个作用域,所以这个变量便定义在该作用域中。而且foo()函数体内并没有做任何作用域延伸的处理,所以在该函数执行完毕之后,这个local变量也随之被销毁。而外层作用域中则无法访问到该变量。而在bar()函数内,local变量并没有使用var 语句进行声明 取而代之的是直接把local 作为全局变量来定义。故外层作用域可以访问到这个变量。
local = {};
//这里的定义等效于
global.local = {};
2:作用域链
在JavaScript 编程的时候,一定会遇到很多层函数嵌套的场景,例如
function foo(){
var val = "helllo";
function bar(){
function baz(){
global.val = 'world';
}
baz();
console.log(val);// =>hello
}
bar();
}
foo();
我开始的时候也不懂,现在一起来看看代码怎么运行的吧
由于在JavaScript中,变量标识符的查找是从当前作用域开始向外查找,知道全局作用域为止,所以JavaScript代码中对变量的访问只能向外进行,而不能逆行。
baz() 函数的执行在全局作用域定义了一个全局变量val。而在bar() 函数中,对val这一标识符进行访问时,按照从内到外的查找原则:在bar函数的作用域中没有找到,便到上一层 foo函数的作用域中查找。
本次的标识符访问在foo()函数的作用域中找到了符合的变量,便不会继续向外查找 所以在baz()函数中定义的全局变量val并没有在本次变量访问中产生影响。
3:闭包
function foo(){
var local = 'Hello';
return function(){
return local;
};
}
var bar = foo();
console.log(bar());// =>hello
外层作用域访问内层作用域(能够访问其他函数内部变量的函数)
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。