javascript 作用域、作用域链理解
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 作用域、作用域链理解的更多相关文章
- 初探JavaScript(四)——作用域链和声明提前
前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...
- JavaScript的作用域与作用域链
作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.可以说,变量和函数在什么时候可以用,什么时候被摧毁,这都与作用域有关. JavaScript中,变量的作用域有全局 ...
- Javascript的作用域、作用域链以及闭包
一.javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#.Java等高级语言,在这些高级语言内 ...
- javascript 之作用域链-07
复习作用域 上一节我们说到作用域:是指变量可以访问的范围,他规定了如何查找变量,以及确定当前执行代码对变量的访问权限:也说到静态作用域即词法作用域,是在编译阶段决定变量的引用(由程序定义的位置决定,和 ...
- 前端知识体系:JavaScript基础-作用域和闭包-JavaScript的作用域和作用域链
JavaScript的作用域和作用域链 作用域: 变量的作用域无非两种:全局作用域和局部作用域 全局作用域: 最外层函数定义的变量拥有全局作用域.即对任何内部函数来说都是可以访问的. <scri ...
- 从零开始讲解JavaScript中作用域链的概念及用途
从零开始讲解JavaScript中作用域链的概念及用途 引言 正文 一.执行环境 二.作用域链 三.块级作用域 四.其他情况 五.总结 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号搜 ...
- JavaScript的作用域和块级作用域概念理解
作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...
- 深入理解Javascript变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- JavaScript之作用域-作用域链
作用域 ==> 作用域链 作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ...
- 浅谈JavaScript的作用域
前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好 ...
随机推荐
- Qt Creator设置多核编译(-j8参数)
In the qtcreator go to the "Projects tab" and set "Make arguments" as you like: ...
- 查看和调试Qt源码
简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进 ...
- HBase启动后发现HMaster进程消失了
HMaster没起来很多原因,这次看日志是这个.详细请看:http://www.bkjia.com/yjs/982064.html Hbase:namespace异常处理,hbase异常处理 Hbas ...
- USB2.0学习笔记连载(五):EZ-USB重要寄存器的配置
本篇博客主要讲解EZ-USB一些重要寄存器的配置,首先对于本篇博客所讲的内容,读者应该到官网上去下载相关的手册,其中包括<EZ-USB Technical Reference Manual> ...
- python公司内部语言规范与语言风格
一.python语言规范 1.1导入 Tip: 仅对包和模块使用导入 定义: 模块间共享代码的重用机制. 优点: 命名空间管理约定十分简单.每个标识符的源都用一种一致的方式指示.x.obj 表示obj ...
- 网络中TCP、IP、MAC、UDP的头部格式信息
TCP头部格式 字段名称 长度(比特) 含义 TCP头部(20字节~) 发送方端口号 16 发送网络包的程序的端口号 接收方端口号 16 网络包的接收方程序的端口号 序号(发送数据的顺序编号) 32 ...
- 利用MATLAB进行曲线拟合
软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合 ...
- QA:Initialization of bean failed; nested exception is java.lang.AbstractMethodError
Q: <hibernate.version>5.2.10.Final</hibernate.version><dependency> <groupId> ...
- MySql 存储过程总结
MySql 存储过程 -- ---------------------------- -- Procedure structure for `proc_adder` -- -------------- ...
- WAS集群:记一次Node Agent不活动问题解决过程
之前很少接触集群,准确地说是很少接触项目现场的实施工作,或者说接触到的都是比较简单的实施工作,安装Linux.WAS.Oracle相对来说都比较简单.一直埋头干着研发的活,干着不要紧,一干就是好几年. ...