JavaScript作用域就是变量和函数的可访问范围。

1.变量作用域

在JavaScript中,变量作用域分为全局作用域和局部作用域。

全局作用域

任何地方都可以定义拥有全局作用域的变量

1.没有用var声明的变量(除去函数的参数)都具有全局作用域,成为全局变量,所以声明局部变量必须要用var

      2.window的所有属性都具有全局作用域

3.最外层函数体外声明的变量也具有全局作用域 

 var globalScope="globalScope";
function checkScope(){
var partScope="part";
scope="scope";
}
checkScope();
console.log(globalScope);//globalScope,全局变量
console.log(scope); //scope,全局变量
console.log(partScope);//Uncaught ReferenceError: partScope is not defined,报错:没有定义partScope

局部作用域

1.函数体内用var声明的变量具有局部作用域,成为局部变量

2.函数的参数也具有局部作用域

var globalScope="globalScope";

        function checkScope(x){
scope="scope"; //变成了全局变量
var partScope="part";//在函数体内,声明局部变量一定要加var
var globalScope="partScope";
}
checkScope(12);
console.log(globalScope);//globalScope,在函数体内,局部变量的优先级高于全局变量
console.log(scope);//scope,全局变量 console.log(partScope);
console.log(partScope);// Uncaught ReferenceError: partScope is not defined,局部变量外面访问不到
console.log(x);//局部变量外面访问不到

  总结:在函数体内局部变量的优先级高于同名的全局变量,声明局部变量必须用var

2.函数作用域

一些类C语言是块级作用域(block scope),每一个花括号是一个作用域,花括号内的代码对外是不可见的。而

JavaScript是函数作用域(function scope),没有块级作用域。无论函数体内的变量在什么地方声明,对整个函数都是可见的,即JavaScript函数里声明的所有变量都被提前到函数体的顶部,只是提前变量声明,变量的赋值还是保留在原位置

函数作用域只能用函数来声明独立作用域,并不是每一个花括号都是一个独立作用域,例如:for循环并不能创建一个局部的作用域

 for(var i=0;i<5;i++){
var scope='scope';
}
console.log(i) //5;i仍然存在,因为JavaScript是函数作用域而不是块级作用域
console.log(scope);//scope;scope仍然存在 function checkScope(){
console.log(funScope); // undefined,函数里声明的所有变量都被提前到函数体的顶部,所以funScope才会认为已经存在
var funScope="funScope";
}
checkScope();

3.作用域链

作用域链:JavaScript的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是全局对象的属性,所以这些对象的关系可以看作是一条链, 
链头就是变量所处的对象,链尾就是全局对象

function checkScope(scope){
var funScope="funScope";
var s=scope;
}

在查找变量funScope的值时,会先查找当前对象,如果当前对象查不到就继续查找作用域链上面的下一个对象,如果作用域链上没有一个对象包含此属性,就抛出引用错误。

在不包含嵌套的函数体内,作用域链上有两个对象:

1.定义函数参数和局部变量的对象

2.全局对象

在包含嵌套的函数体内,作用域链上至少有三个对象

javascript 作用域、作用域链理解的更多相关文章

  1. 初探JavaScript(四)——作用域链和声明提前

    前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...

  2. JavaScript的作用域与作用域链

    作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.可以说,变量和函数在什么时候可以用,什么时候被摧毁,这都与作用域有关. JavaScript中,变量的作用域有全局 ...

  3. Javascript的作用域、作用域链以及闭包

    一.javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#.Java等高级语言,在这些高级语言内 ...

  4. javascript 之作用域链-07

    复习作用域 上一节我们说到作用域:是指变量可以访问的范围,他规定了如何查找变量,以及确定当前执行代码对变量的访问权限:也说到静态作用域即词法作用域,是在编译阶段决定变量的引用(由程序定义的位置决定,和 ...

  5. 前端知识体系:JavaScript基础-作用域和闭包-JavaScript的作用域和作用域链

    JavaScript的作用域和作用域链 作用域: 变量的作用域无非两种:全局作用域和局部作用域 全局作用域: 最外层函数定义的变量拥有全局作用域.即对任何内部函数来说都是可以访问的. <scri ...

  6. 从零开始讲解JavaScript中作用域链的概念及用途

    从零开始讲解JavaScript中作用域链的概念及用途 引言 正文 一.执行环境 二.作用域链 三.块级作用域 四.其他情况 五.总结 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号搜 ...

  7. JavaScript的作用域和块级作用域概念理解

    作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...

  8. 深入理解Javascript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  9. JavaScript之作用域-作用域链

    作用域 ==> 作用域链   作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ...

  10. 浅谈JavaScript的作用域

    前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好 ...

随机推荐

  1. PCL点云特征描述与提取(4)

    如何从一个深度图像(range image)中提取NARF特征 代码解析narf_feature_extraction.cpp #include <iostream> #include & ...

  2. Opengl绘制我们的小屋(四)第三人称漫游

    本节内容是在第一人称漫游上完成的,请先了解上文中第一人称漫游的实现. 这一节讲下第三人称漫游是如何实现,第三人称,简单来说,就是在你后面会跟着一台摄像机顺着你拍摄. 先看一下失败的尝试.这个方法是把人 ...

  3. 关于session_cache_expire 的理解

    session_cache_limiter,它是session在客户端的缓存方式,有nocache,private,private_no_expire,publice主这几种. cache是属于浏览器 ...

  4. Java的图形用户界面的基本工具

    AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具. AWT中 ...

  5. C语言中 Float 数据结构的存储计算

    1.了解float存储结构 float存储结构请看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875 2.float最大值 fl ...

  6. Unity 基础-------------------------关于Anchor锚点的理解

    Unity进阶技巧 - RectTransform详解 Zui 关注 2016.02.17 01:27 字数 1704 阅读 22157评论 13喜欢 57赞赏 2 RectTransform属性一览 ...

  7. om.ibm.ws.jsp.translator.JspTranslationException:JSPG0227E解决办法

    原文链接:http://blog.163.com/rambosir@126/blog/static/124116406201212834417/ 今天在完成功能后,将jsp页面部署至websphere ...

  8. image 和 barplot 的组合

    代码示例: par(mfrow = c(1, 2)) par(mar = c(1, 10, 1, 0), las = 1, ann = F) image(1:10, 1:10, matrix(samp ...

  9. TensorFlow-GPU:查看电脑显卡型号是否支持CUDN,以及相关软件下载与介绍

    1.显卡(GPU)是否支持CUDN https://developer.nvidia.com/cuda-gpus 2.了解基础知识 1)CUDA(Compute Unified Device Arch ...

  10. SOA及分布式

    结合领域驱动设计的SOA分布式软件架构 Windows平台分布式架构实践 - 负载均衡(下) 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载 我终于深入参与了一 ...