闭包、作用域、作用域链

一 作用域,作用域链

先上代码

1 var scope="global";
2 function t(){
3     console.log(scope);
4     var scope="local"
5     console.log(scope);
6 }
7 t();  

此时打印出来的 按顺序分别是undefine,local,为什么第一个是undefined呢,摘抄下js作用域原话:

Javascript没有块级作用域,而是函数作用域.

所谓函数作用域就是说:-》变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

所以此段代码就可以解释为:

var scope="global";
 function t(){
     var scope;
     console.log(scope);
     scope="local"
     console.log(scope);
 }
 t();  

所以明显看出来第一句打印,只是重新声明了变量,而没有赋值

二 闭包与this

在闭包中使用this对象会出现一些问题,this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被当作某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window(当然,在通过call()和apply()改变函数执行环境时,this指向其他对象)。

var name="The Window";  

var object={
    name:"My object",
    getNameFunc:function(){
        return function(){
            return this.name;
            };
        }
    };
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)
此时弹出  The Window

如果要改变,那么我自己的理解就是让闭包能 根据活动函数上下文找到 外部函数的变量,那么就把this重新赋值给一个变量

var name="The Window";  

var object={
    name:"My object",
    getNameFunc:function(){
      var that = this;
        return function(){
            return that.name;
            };
        }
    };
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)
此时弹出  My object

三 闭包的内存释放与执行规则

直接上代码

function fun03()
      {
          var a = 10;
          return function(){
              a*= 2 ;
              return a ;
          };
      }  

      var f = fun03();
      f();
      var x = f();
     console.log(x);  //40  

      var g = fun03();
      var y = g();
      console.log(y); //20 

为什么第一句打印的是40,第二句打印20呢,目测看到的原因是第一句打印  f()执行了两次(但是函数一旦执行后那么里面的局部变量就会销毁,但是为什么没有被销毁呢,这就是闭包的作用)

因为闭包可以使变量不被释放,始终存在内存中,因为fun03是其中匿名函数(闭包)的父函数,而匿名函数又被赋值给了一个全局变量,所以f一直在内存中,而f又依赖于fun03所以这就导致其中的a变量一直存在,当运行两次后a进行了累加计算

时间: 2024-10-07 06:09:54

闭包、作用域、作用域链的相关文章

闭包,作用域链,垃圾回收,内存泄露

关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --<JS高级程序设计第三版> p178 函数对象可以通过作用域链相关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性称为 ‘闭包’ . --<JS权威指南> p183 内部函数可以访问定义它们的外部函数的参数和变量(除了this和argument

js闭包和作用域链

闭包 闭包 函数对象之间可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内 这种特性称做“闭包”. 什么是变量? 变量就是为一切事物赋的一个name; var的作用,初始化变量. 变量作用域 程序源码中定义这个变量的区域就就是变量作用域.(名字放在什么地方了) 全局变量拥有全局作用域,在js代码的任何地方都是有定义的.(这个名字很响亮) 在函数体内声明的变量在函数体内有效,他们是局部变量,函数参数也是局部变量他们只在函数体内有定义.(里层的能拿到的外层的值,外层的拿不到里层的

作用域链、闭包和原型链

Function:  匿名函数,作用域,作用域链和闭包 函数的重载:  什么是:函数名相同,参数列表不同.根据传入函数的参数的不同,整形不同的逻辑. 何时用:如果一项任务,根据不同的参数,不执行不用的逻辑. 优点:减轻调用者的负担.  问题:js语法不知函数的重载. 解决办法:在函数中都有arguments的属性,专门用于接收传入函数的所有参数值的类数组对象. 匿名函数:  什么是:在函数定义时,不给函数名,即不被任何变量引用. 何时用:确定函数只使用一次.  优点:节约内存. 如何用:1.自调

JavaScript this 局部变量全局变量 作用域 作用域链 闭包

从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 代码段二: var name = "The Window"; var object

JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点: 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一大

闭包.词法作用域#

JS程序的执行过程. 1.词法分析 .  语法分析阶段:变量声明(赋值阶段在执行阶段进行);函数声明带函数赋值. 2.函数表达式的变形 //函数表达式的变形 var fn=function foo(){ console.log("abc"); }; fn();//"abc" foo();//报错 2.词法作用域,作用域链,变量查找过程 按照书写个还是决定了变量可访问的范围,跟调用方式无关 var height =10; setTimeout(function(){

JavaScript中的匿名函数及函数的闭包以及作用域

1. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

js闭包跟作用域

作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个函数中声明的变量以及该函数的参数享有同一个作用域,即函数作用域.一个简单的函数作用域的例子: function foo() {var bar = 1;{var bar = 2;}return bar; // 2} 不同于C等其它有块作用域的语言,这里将始终返回 2 . 全局作用域,对于浏览器来说可以

Javascript 进阶 作用域 作用域链

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1.Javascript没有代码块作用域的概念,局部作用域是针对函数来说的. function fun() { for( var i = 0 ; i < 10 ; i++) {} //如果在Java中i此时应当属于未声明的变量,但是Js中i的作用域依然存在 console.log(i);//10 if(

读书时间《JavaScript高级程序设计》三:函数,闭包,作用域

上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ //code... } //函数表达式 var functionName = function(arg0,arg1,arg2){ //code... }; 函数声明有个重要的特征是函数申明提升.就是在执行代码前会先读取函数声明,意味着可以把函数声明放在调用它的语句后面. //函数声明提升 sayH