1. 什么是作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量的作用范围。

  2. 变量的分类和变量作用域的分类

在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量的作用域有全局作用域和局部作用域两种。

  3. 全局变量和全局作用域

  在函数外声明的变量为全局变量,全局变量所对应的作用域为全局作用域。看如下代码:

var globalEle = "世界这么大";
function func(){
console.log("函数内部:" + globalEle);
}
func();
console.log("函数外部:" + globalEle);

  打印结果:

  结果分析:

  在函数外部声明了一个变量globalEle,因此它为全局变量,拥有全局作用域,全局变量无论在函数内部还是函数外部都可以被访问。

  4. 局部变量和局部作用域

  在函数内声明的变量为局部变量,局部变量所对应的作用域为局部作用域。看如下代码:

function func(){
var localEle = "而我在国内"
console.log("函数内部:" + localEle);
}
func();
console.log("函数外部:" + localEle);

  打印结果:

  结果分析:

  在函数内部声明了一个变量localEle,因此它为局部变量,拥有局部作用域,局部变量只能在当前声明的函数内起作用,因此在函数外访问局部变量会提示not defined。

  5. 什么是作用域链

  作用域链的建立过程此处不详细讲,一些官网定义的抽象的概念也不多加以阐述,就通过下面的例子来看一下,看如下代码:

var ele = "函数外面定义的变量";
function func(){
var ele = "函数func内定义的变量";
function son(){
var ele = "函数son内定义的变量";
console.log(ele);
}
son();
}
func();

  打印结果:

  结果分析:变量ele被定义了三次,但他们的作用域不同,第一次定义的ele是全局变量,拥有全局作用域。第二次定义的ele是局部变量,在函数func内起作用,因为函数son是函数func的子函数,所以在函数son内也可以访问到这里定义的变量。第三次定义的ele也是局部变量,在函数son内部起作用。所以,在函数son内部访问变量ele也就是打印变量ele的时候,会依照就近原则先去访问函数son内部的定义的变量ele,如果找不到会一层层网上找,直到最上面一层,如果依旧找不到会提示not defined。希望你能通过这个简单的案例理解作用域链。

  好啦,就说这么多咯,以上说法有不严谨之处还请各位指正,祝工作愉快!

  

  

深入浅出:JavaScript作用域链的更多相关文章

  1. JavaScript作用域链的理解

    前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...

  2. JavaScript 作用域链图具体解释

    <script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...

  3. javascript深入浅出图解作用域链和闭包

    一.概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数. 关键点: 1.闭包是一个函数 2.能够访问另外一个函数作用域中的变量 文章首发地址于sau交流学习社 ...

  4. JavaScript作用域链

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

  5. 个人理解的javascript作用域链与闭包

    闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...

  6. javascript作用域链学习笔记

    作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...

  7. (好文推荐)一篇文章看懂JavaScript作用域链

    闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: var name = "stephenchan"; var age = 23; func ...

  8. 深入javascript作用域链到闭包

    我之前用过闭包,用过this,虽然很多时候知道是这么一回事,但是确实理解上还不够深入.再一次看javascript高级程序设计这本书时,发现一起很多疑难问题竟然都懂了,所以总结一下一些理解,难免有错, ...

  9. 图解 javascript 作用域链

    还是之前那一段简单的javascript代码: window.onload=function(){ function sub(a,b){ return a-b; } var result=sub(10 ...

随机推荐

  1. 201521123016《java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 面向对象设计(大作业1,非常重要) 2.1 将在网上商城购物或 ...

  2. Python的自学之路:Python基础(一)

    声明:我写博客不是为了什么,只是为了记录自己的学习状态,学过的知识点!方便以后进行好的复习!python小白,勿喷 python环境的搭建,在这里就不细说了,这里有我的链接,可以参考一下:https: ...

  3. JDBC第四篇--【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的. 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接池 ...

  4. 上传文件复用代码【fileUpload】

    这是使用了FileUpload上传组件的,解决了中文乱码问题了,并且删除了临时文件的. 使用了一个Book对象做示范 private Book uploadData(HttpServletReques ...

  5. 02函数-05-generator(ES6)

    generator(生成器)是ES6标准引入的新的数据类型. generator看上去像一个函数,但可以返回多次,除了return语句,还可以用yield返回多次.定义方式如下: function* ...

  6. 如何使用Flexbox和CSS Grid,实现高效布局

    CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...

  7. 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容

    背景 笔者的VS2012版本比较老旧,是几年以前下载的.平时添加三方包和驱动包都是手动添加.后来了解到有Nuget这个工具,如获至宝.可是在使用过程中却出了不少问题. 最初,笔者尝试使用Nuget添加 ...

  8. Android + HTML5 混合开发

    摘要: 对于 Android + HTML5 混合开发以下的观点仅仅是我的个人观点,如果有什么不对的地方请指正 简介: 混合开发的 App(Android + HTML5)就是在一个 App 中内嵌一 ...

  9. [js高手之路] 设计模式系列课程 - 迭代器(1)

    迭代器是指通过一种形式依次遍历数组,对象,或者类数组结构中的每个元素. 常见的有jquery中的each方法, ES5自带的forEach方法. 下面我们就来自定义一个类似jquery或者ES5的迭代 ...

  10. Java对象大小:size和retained size

    最近看到网上很多文章讲如何计算java对象的大小(size),很多观点不敢苟同. 这是其中一篇比较靠前的文章,写的也比较全面: http://blog.csdn.net/iter_zc/article ...