内存优化及作用域(scope)

来源:互联网 发布:高仿包包淘宝上哪里买 编辑:程序博客网 时间:2024/05/22 13:42

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代码中对变量的访问只能向外进行,而不能逆行。

http://ww1.sinaimg.cn/large/7287333fgw1eegzhw6g3mj209805faa5.jpg

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语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。


闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

 

0 0
原创粉丝点击