var scope = 'global';
var f = function () {
  console.log(scope); // 输出 undefined
  var scope = 'f';
}
f();

上面代码可能和你预想的不一样,没有输出 global, 而是undefined,这是为什么呢?
这是 JavaScript
的一个特性,按照作用域搜索顺序,在 console.log
函数访问 scope

量时, JavaScript
会先搜索函数 f 的作用域,恰巧在 f 作用域里面搜索到 scope
变量,
所以上层作用域中定义的 scope
就被屏蔽了,但执行到 console.log
语句时, scope

没被定义,或者说初始化,所以得到的就是 undefined
值了

 var f = function() {
  var scope = 'f0';
  (function() {
    var scope = 'f1';
    (function() {
      console.log(scope); // 输出 f1
    })();
  })();
};
f();

上面是一个函数作用域嵌套的例子,我们在最内层函数引用了 scope
变量,通过作用
域搜索,找到了其父作用域中定义的 scope
变量。
有一点需要注意:函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就
是说, JavaScript
的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可
以在语法分析时确定,而不必等到运行时确定。下面的例子说明了这一切:

var scope = 'top';
var f1 = function() {
  console.log(scope);
};
f1(); // 输出 top
var f2 = function() {
  var scope = 'f2';
  f1();
};
f2(); // 输出 top

这个例子中,通过 f2
调用的 f1
在查找 scope
定义时,找到的是父作用域中定义
的 scope
变量,而不是 f2
中定义的 scope
变量。这说明了作用域的嵌套关系不是在调用
时确定的,而是在定义时确定的

JS中作用域的更多相关文章

  1. 关于JS中作用域的销毁和不销毁的情况总结

    window全局作用域->页面关掉才销毁函数执行会形成私有的作用域 1)作用域的销毁 一般情况下,函数执行形成一个私有的作用域,当执行完成后就销毁了->节省内存空间 2)作用域的不立即销毁 ...

  2. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  3. JS中作用域和变量提升(hoisting)的深入理解

    作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部 ...

  4. js中作用域链的问题

    为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...

  5. js中作用域和闭包

    作用域链实例   (1) function example() { var age = 23; alert(age) } var age = 25; example(); alert(age); // ...

  6. js中作用域链和作用域

    作用域 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称(变量名或者函数名)进行变量查找. 经过研究<高级程序设计 ...

  7. JS中作用域和作用域链

    1.执行环境(execution context) 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为.每个执行环境都有与之对应的变量对象(variable object),保存着该环境 ...

  8. JS中for循环变量作用域--解决for循环异步执行的问题

    被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...

  9. JS中的的"闭包"?深入Javascript之this

    看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...

随机推荐

  1. 在vs中打开cuda工程

    以往都是在linux环境下使用cuda,编写cuda程序,因为一篇论文的源码要求用win系统+vs,首次在vs中打开.编译cuda工程,遇到一些阻碍,特此记录. 我的计算机环境是win10,cuda7 ...

  2. Django发送带图片和附件的邮件

    最近需要做集团的SRC系统.暂无安全研发,所以只能找我这个小菜兼职开发.系统使用Django框架,在整个过程中,有许多奇特的需求.在某项需求中,需要给厂商用户发送富文本邮件,漏洞详情,这个折腾了一下, ...

  3. angular2 日期格式化

    angular2 日期格式话 ng2 在模板中格式话显示日期使用 DatePipe 管道(其实就是ng1里面的过滤器(filter),换了个说法), 如下示例: 1 <div class=&qu ...

  4. python 、mmap 实现内存数据共享

    import mmap mmap_file = None ##从内存中读取信息, def read_mmap_info(): global mmap_file mmap_file.seek(0) ## ...

  5. css基本布局

    一.一列布局 关键代码: {              width:960;         margin:0 auto: } 代码: 运行结果:     分析:以上代码实现一列布局,头部占整个浏览器 ...

  6. 通过取父级for循环的i来理解闭包,iife,匿名函数

    在使用for循环的时候,假如需要在循环体中添加一个匿名函数处理其他的事情,那么,在这个匿名函数内,如果需要用到对应的i,因为闭包的缘故,循环体循环结束后才返回i,所以i最终为最后一次++的数值.   ...

  7. cookie技术简介

    Cookie简介 众所周知,HTTP协议是一个无状态的协议.一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义.用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server ...

  8. 老李知识普及:web安全性的两大权威组织

    老李知识普及:web安全性的两大权威组织 两个重要的WEB应用安全组织-WASC/OWASPWeb Application Security Consortium (WASC)a.WEB应用安全标准的 ...

  9. ORACLE JOB创建

    Connected Connected as focususer SQL> SQL> --JOB 需要在命令行执行: SQL> --抽数job SQL> CREATE OR R ...

  10. python 日期 & 时间

    1. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 2. 时间间隔是以秒为单位的浮点小数. 3. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长 ...