大多数类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. 飞流直下的精彩 -- 淘宝UWP中瀑布流列表的实现

    在淘宝UWP中,搜索结果列表是用户了解宝贝的重要一环,其中的图片效果对吸引用户点击搜索结果,查看宝贝详情有比较大的影响.为此手机淘宝特意在搜索结果列表上采用了2种表现方式:一种就是普通的列表模式,而另 ...

  2. 让浏览器不再显示 https 页面中的 http 请求警报

    HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 http 请求,一旦出现就是提示或报错: Mix ...

  3. Express4 启航指南

    确实有感而发,Nodejs真的发展太快了,这么说的原因有两点:自己去年冬天买了本<了不起的Node.js>,里面介绍Express的版本还是2.x.x:前些天小伙伴买了本<Node. ...

  4. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  5. 三国魂破解1——resmask.swf

    这个是资源文件的映射. 根据index.swf的加载流程,直到初始化会加载: 破解方式: var l:URLLoader = new URLLoader(); l.dataFormat = URLLo ...

  6. [ASP.NET MVC 小牛之路]12 - Section、Partial View 和 Child Action

    概括的讲,View中的内容可以分为静态和动态两部分.静态内容一般是html元素,而动态内容指的是在应用程序运行的时候动态创建的内容.给View添加动态内容的方式可归纳为下面几种: Inline cod ...

  7. [ASP.NET MVC 小牛之路]16 - Model 验证

    上一篇博文 [ASP.NET MVC 小牛之路]15 - Model Binding 中讲了MVC在Model Binding过程中如何根据用户提交HTTP请求数据创建Model对象.在实际的项目中, ...

  8. EF:自定义Oracle的映射类型

    oracle在DB First模式下,int类型的字段会自动映射为decmial类型的属性. 我们可以通过自定义类型映射进行“纠整”. 在app.config 自定义映射规则: <oracle. ...

  9. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  10. Tips for newbie to read source code

    This post is first posted on my WeChat public account: GeekArtT Reading source code is always one bi ...