资讯专栏INFORMATION COLUMN

通俗易懂介绍js作用域链和闭包,不懂的进!

ddongjian0000 / 996人阅读

摘要:作用域作用域分为全局作用域和局部作用域。相互之间的操作并不影响。这里的相当于私有变量,对于每一个对象来讲,也都是不同的。作用域链的查找规则

es5作用域
javascript作用域分为全局作用域和局部作用域。在全局作用域内定义的就是全局变量,即window对象上的局部变量;局部作用域是函数作用域,注意是函数作用域而不是大括号作用域!
function test() {
  var num = 1;
  if (true) {
    num = 2;
    alert(num); // 2
  }
  alert(num); // 2 
}
var scope="global";  
function t(){  
    console.log(scope);  // undefined,变量提升
    var scope="local"  
    console.log(scope);  // local
}  
t(); 
function Test() {
  var a = 1;
  this.b = 1;
  this.show = function() {
    alert("a=" + a);
    alert("b=" + this.b);
  }
  this.setValue = function() {
    a = 2;
    this.b++;
  }
}

var obj1 = new Test();
obj1.show(); // a=1,b=1;
var obj2 = new Test();
obj2.setValue();
obj2.show(); // a=2,b=2;
obj1.show(); // a=1,b=1;

上面的实例中,a是构造函数内部的一个变量,我们在实例化obj1和obj2之后,发现在实例化对象时,obj1和obj2各有一个作用域,其中的a并不是一份,而是不同的值。相互之间的操作并不影响。这里的a相当于私有变量,对于每一个对象来讲,也都是不同的。
(function() {
  var privateStatic = "privatestatic";
  Func = function() {
    this.setPrivateStatic = function(value) {
      privateStatic = value;
    }
    this.getPrivateStatic = function() {
      return privateStatic;
    }
  }
})();

var func1 = new Func();
var func2 = new Func();
console.log(func1.getPrivateStatic()); // privatestatic
console.log(func2.getPrivateStatic()); // privatestatic

console.log(func1.setPrivateStatic("changed"));
console.log(func2.getPrivateStatic()); //changed
(function b() {
  var c = 1;
  a(); // c is not defined
})()

function d() {
  var c = 2;
  console.log(c);
};

(function b() {
  var c = 1;
  d(); // 2
})()

js作用域链的查找规则

https://www.cnblogs.com/dolph...
http://www.cnblogs.com/dolphi...
https://www.cnblogs.com/lhb25...
http://www.cnblogs.com/zxj159...
https://www.cnblogs.com/syfwh...
https://www.cnblogs.com/myyou...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98157.html

相关文章

  • JS基础知识:变量对象、作用链和闭包

    摘要:前言这段时间一直在消化作用域链和闭包的相关知识。而作用域链则是这套规则这套规则的具体运行。是变量对象的缩写那这样放有什么好处呢我们知道作用域链保证了当前执行环境对符合访问权限的变量和函数的有序访问。 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些技术博客,对于这些概念的论述多多少少不太清楚或者不太完整,包括一些大神的技术文章。这也给我的学习上造成了一些困惑,...

    Keven 评论0 收藏0
  • 【进阶2-1期】深入浅出图解作用链和闭包

    摘要:本期推荐文章从作用域链谈闭包,由于微信不能访问外链,点击阅读原文就可以啦。推荐理由这是一篇译文,深入浅出图解作用域链,一步步深入介绍闭包。作用域链的顶端是全局对象,在全局环境中定义的变量就会绑定到全局对象中。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周开始前端进阶的第二期,本周的主题是作用域闭包,今天是第6天。 本...

    levius 评论0 收藏0
  • js知识梳理6:关于函数的要点梳理(2)(作用链和闭包)

    摘要:在此例中,在匿名函数被返回后,它的作用域链初始化为包含函数的活动对象和全局变量对象。函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象,结果就是只是的执行环境的作用域链会被销毁,其活动对象会留在内存中。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,...

    aristark 评论0 收藏0
  • javascript系列--javascript深入浅出图解作用链和闭包

    摘要:变量对象也是有父作用域的。作用域链的顶端是全局对象。当函数被调用的时候,作用域链就会包含多个作用域对象。当函数要访问时,没有找到,于是沿着作用域链向上查找,在的作用域找到了对应的标示符,就会修改的值。 一、概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数。 关键点: 1、闭包是一个函数 2、能够访问另外一个函数作用域中的变量 二、闭包特性 对...

    Jensen 评论0 收藏0
  • js中的作用链和闭包

    摘要:所以,当在函数中使用全局变量的时候,所产生的代价是最大的,因为全局对象一直处于作用域链的最末位置,读取局部变量是最快的。 什么是作用域 在编程语言中,作用域控制着变量与参数的可见性及生命周期,它能减少名称冲突,而且提供了自动内存管理(javascript 语言精粹) 静态作用域 再者,js不像其他的编程语言一样,拥有着块级作用域,就像下面一段代码。 function afunction...

    LucasTwilight 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<