作用域和闭包

・作用域

  引擎:从头到尾负责整个JavaScript的编译及执行过程。

  编译器:负责语法分析及代码生成等。

  作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

  作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。

  如果查找的目的是对变量进行赋值,那么就会使用LHS查询;

  如果目的是获取变量的值,就会使用RHS查询。

・词法作用域

  无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。

  欺骗词法:两种机制。欺骗词法作用域会导致性能下降。

  eval():

  function foo(str, a) {

    eval(str);

    console.log(a, b);

  }

  var b = 2;

  foo(“var b = 3; ”, 1);

  // 1, 3

  with():

  function foo(obj) {

    with(obj) {

  a = 2;

  }

 }

  var o1 = { a: 3};

  var o2 = { b: 3};

  foo(o1);

  console.log(o1.a); // 2

  foo(o2);

  console.log(o2.a); // undefined

  console.log(a); // 2

・函数作用域和块作用域

  隐藏内部实现:可以把变量和函数包裹在一个函数的作用域中,然后用这个作用域来隐藏它们。

  最小特权原则(最小授权或最小暴露原则):最小限度地暴露必要内容,而将其他内容都隐藏起来。

  规避冲突:隐藏作用域中的变量和函数,可以避免同名标识符之间的冲突。

  包装函数:

  (function foo() {

    var a = 3;

    console.log(a);

  })();

  匿名函数:

  setTimeout(function() {…}, 1000);

  缺点:

  匿名函数在栈追踪中不会显示出有意义的函数名,使得调试困难;

  如果没有函数名,当需要引用自身时只能使用已过期的arguments.callee引用;

  匿名函数省略了对于代码可读性/可理解性很重要的函数名。

  给函数表达式指定一个函数名可以有效解决以上问题:

  setTimeout(function timeoutHandler() {…}, 1000);

  块作用域:

    let关键字可以将变量绑定到所在的任意作用域中;

    使用let进行的声明不会在块作用域中进行提升;

  提升:

    只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。

    如果提升改变了代码执行的顺序,会造成非常严重的破坏;

  函数声明和变量声明都会被提升,但是函数会首先被提升;

  foo(); // 1

  var foo;

  function foo() {

console.log(1);

  }

  foo = function() {

console.log(2);

  }

  ・作用域闭包

  只要使用了回调函数,实际上就是在使用闭包;

  模块模式具备的两个必要条件:

  必须有外部的封闭函数,该函数必须至少被调用一次;

  封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态;

  function CoolModule() {

    var something = “cool”;

  var another = [1, 2, 3];

  function doSomething() {

  console.log(something);

  }

  function doAnother() {

    console.log(another.join(“!”));

  }

  return {

    doSomething: doSomething,

    doAnother: doAnother

  };

 }

  var foo = CoolModule();

  foo.doSomething();

你不知道的JavaScript(作用域和闭包)的更多相关文章

  1. javascript作用域和闭包之我见

    javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...

  2. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  3. 你不知道的JavaScript --- 作用域相关

    本篇是<你不知道的JavaScript>的读书笔记 什么是作用域? 程序离不变量,那么变量存储在哪里?程序需要时如何找到他们? 这些问题说明需要一套设计良好的规则来存储变量, 并且之后可以 ...

  4. JavaScript作用域和闭包

    在JavaScript中,作用域是执行代码的上下文.作用域有3种类型: 1.全局作用域 2.局部作用域---(又叫函数作用域) 3.eval作用域 var foo =0;//全局作用域console. ...

  5. 举例详细说明javascript作用域、闭包原理以及性能问题(转)

    转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...

  6. JavaScript 作用域和闭包

    作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...

  7. javascript作用域、闭包、对象与原型链

    原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...

  8. javascript作用域与闭包

    Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1)  全局作用域 2)  局部作用域(函数作用域) 3)  eval作用域 var foo = ...

  9. JavaScript作用域与闭包总结

    1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...

  10. javascript——作用域与闭包

    http://www.cnblogs.com/lucio-yr/p/4047972.html 一.作用域: 在函数内部:用 var 声明的表示局部变量,未用var的是全局变量. 作用域取决于变量定义时 ...

随机推荐

  1. ss sp行情

    SS Securities Standard SP Securities Premium 優行情質 Securities Standard (SS), Premium (SP), FullTick S ...

  2. Mysql学生管理系统:表的建立,外键一对多,多对多关系,中间关联表的建立

    学生管理系统 管理员注册/登录/注销 注册班级(班级详细信息) 注册学生信息 查看班级信息/查看老师资料 教师注册/注销  查看教师资料  查看学生资料  根据名称/班级/ 查看学生详细信息--支持模 ...

  3. angularJS 服务三

    路由 一 简介 1.路由机制 为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以在页面 ...

  4. Manacher思想 SCOI2013 密码

    关于$\mathrm{Manacher}$算法,网上介绍已经很全面 这里说一下自己的理解 这里的$rad$数组:$rad_i$表示以以位置i为中心的最长回文串的回文半径(不包括i这个点). 朴素的思想 ...

  5. SQL Server通过整理索引碎片和重建索引提高速度

    本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...

  6. VMware于CentOS网络设置

    VMware于CentOS网络设置 底: 笔记本电脑有两块网卡: 1. 网卡连接公司内网,仅仅配置了内网ip和子网掩码. 2. 无线网卡.连接4g无线路由器.dhcp自己主动配置. 问题: 在VMwa ...

  7. CSRF跨站点请求伪造漏洞问题

    最近在写php,项目写完后送检发现一个漏洞问题CSRF,强行拖了我一天的时间,沉迷解决问题,茶饭不思,日渐消瘦,时间比较赶,这篇比较糙,凑合看下. 好了废话不多说下面是今天的解决方案. 博主用的是Th ...

  8. Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))

    1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输 ...

  9. Linux开发工具之gdb(上)

    三.gdb调试(上) 01.gdb:gdb是GNU debugger的缩写,是编程调试工作. 功能:   启动程序,可以按照用户自定义的要求随心所欲的运行程序:   可让被调试的程序在用户所指定的调试 ...

  10. Chain of Responsibility 责任链模式

    简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...