大多数类c的语言,由一对花括号封闭的代码块就是一个作用域。但是javascript的作用域则是通过函数来定义。在一个函数中定义的变量只对这个函数内部可见,我们称为函数作用域。

1.在函数中引用一个变量,javascript会先搜索当前函数作用域,没有找到则搜索上层作用域,一直到全局作用域。

var a = ;
var f = function(){
  console.log(a);
  var a = ;
}
f()
你可能预想会输出,但实际上输出的undefined。why?我们可以通过上述的文字描述进行分析,调用f函数,在console.log访问a变量时,javascript会先搜索当前函数作用域,恰巧在f函数作用
域内搜索到a变量,所以外层变量设置的a=123就会被屏蔽掉,但是执行到console.log时,a还未被初始化,所以输出为未定义。
我们可以进一步理解为无论在函数内部任何地方定义的变量(即不分先后顺序),在一进入函数时就被定义,但直到运行到var那一行,才初始化值。

2.函数作用域的嵌套关系

函数作用域的嵌套关系是定义时决定的,而不是调用时决定的。也就是说javascript的作用域是静态作用域,作用域的嵌套关系在语法分析时确定,而不必等到运行时确定。如何理解呢?看下边的例子。

var a = ;
var f1 =function(){
  console.log(a)
};
var f2 =function(){
   var a = 456 ;
   f1();
};
f2();
你可能预想会输出456,然而再次事与愿违,实际输出的是123.通过f2调用的f1,在查找a的定义时,找到的是f1父作用域定义的a变量(即全局作用域的a变量),而不是f2中定义的a变量。
说明函数作用域的嵌套关系是在定义时决定的,而不是调用时才确定。
var a = [,,]
for(var i = ;i < a.length ;i++){
setTimeout(function(){
     console.log(a[i])
},)
}
//三次输出都是未定义。因为setTimeout相当于异步操作,那么在循环结束之后,i变量值为3.然后当0.1秒后,console.log调用i,三次输出的i的值都为3,a[3]自然就不存在

按照下边设置,就可以按照正常输出1,2,3,相当于建立了闭包,传入的i在setTimeout函数没有执行完不会销毁。

var a = [1,2,3]
for(var i = 0;i < a.length ;i++){
(function(i){setTimeout(function(){
     console.log(a[i])
},100)})(i)
}

 

javascript作用域中令你意想不到的问题的更多相关文章

  1. javaScript中的小细节-局部作用域中的var

    javaScript中var是很神奇的,在局部作用域中,var a = b = c = 1;是不一样的,a为使用var声明的变量,而b和c则是全局下的,此类变量被称为隐式全局变量:var a = 1; ...

  2. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(转载 学习中。。。)

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  3. javascript学习中自己对作用域和作用域链理解

    在javascript学习中作用域和作用域链还是相对难理解些,下面我关于javascript作用域和作用域链做一下详细介绍,给各位初学者答疑解惑. 首先我们介绍一下什么是作用域?  从字面上理解就是起 ...

  4. JavaScript作用域及作用域链详解、声明提升

    相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局 ...

  5. JavaScript作用域

    JavaScript作用域 JavaScript作用域一直是前端开发的难题,现在只要用五句话就可解决. 一.“JavaScript中无块级作用域” 在Java或C#中存在块级作用域,即:大括号也是一个 ...

  6. JavaScript 作用域知识点梳理

    JavaScript的作用域一直以来是前端开发中难以理解的知识点,对于JavaScript的作用域主要记住几句话. 一.“JavaScript” 中无块级作用域 在   Java 或 C# 中存在块级 ...

  7. 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域

    × 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...

  8. 关于Javascript作用域及作用域链的总结

    本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/200 ...

  9. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

随机推荐

  1. PHP的日期和时间处理函数

    1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...

  2. <2048>调查报告心得与体会

    老师这次给我们布置了一个任务,就是让我们写一份属于自己的调查报告,针对这个任务,我们小组的六个人通过积极的讨论,提出了一些关于我们产品的问题,当然这些问题并不是很全面,因为我们是从自己的角度出发,无法 ...

  3. PostgreSQL 杂志

    pgmag 团队刚发布了头两期 PostgreSQL 杂志,还有中文版http://pgmag.org/download,推荐广大 PostgreSQL 数据库管理员及开发者阅读: Issue #01 ...

  4. .NET面试题系列[9] - IEnumerable

    .NET面试题系列目录 什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerable<T>是一个接口,它只含有一个方法GetEnumera ...

  5. Lesson 5 No wrong numbers

    Text Mr.James Scott has a garage in Silbury and now he has just bought another garage in Pinhurst. P ...

  6. WebApiThrottle限流框架使用手册

    阅读目录: 介绍 基于IP全局限流 基于IP的端点限流 基于IP和客户端key的端点限流 IP和客户端key的白名单 IP和客户端key自定义限制频率 端点自定义限制频率 关于被拒请求的计数器 在we ...

  7. 2013 duilib入门简明教程 -- 响应按钮事件(4)

        上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI;     也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介 ...

  8. JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString

    JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...

  9. iOS-调试技巧

    目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象 ...

  10. CSS之flex布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...