js之作用域
1.什么是作用域
作用域是用于收集存储维护变量,以及当前执行代码声明的变量所拥有的权限,
例如 :
function foo(a){
console.log(a); -------- 1
};
foo(666);
console.log(a); -------
此时执行该段代码
1 -- 处打印我们得到 666 因为在函数中声明了 a 参数 且执行foo函数像里面传入666就相当于将a赋值为666 所以console.log 查询a可以获得666
2 --处打印我们获取一个报错 Uncaught ReferenceError: a is not defined 说a没有定义,这是为什么呢.
2.1 首先我们来说明下LHS 查询和RHS查询(书上给的解释是: 赋值操作的左侧或右侧)
我的理解是
LHS --- 被赋值的变量
RHS --- 查询变量的值
且这两种查询都是从本身所在作用域向上冒泡查询直到遇到定义的变量位置,
不同的是 :
1.RHS 在本作用域查询变量遇到不存在需要查询的变量则逐级向上一级作用域查询,查到则停止,否则直到到window作用域还没有查到则会返回一个 xxx is not defined
2.LHS 在本作用域查询变量遇到不存在需要查询的变量则逐级向上一级作用域查询,查到则停止, 到window作用域还没有查到则会默认再window 全局变量处偷偷的创建这个需要查询的变量
下面用一段简单的代码来说明 LHS 和 RHS
function foo1(a){
console.log(g)
//这里将会出现报错 g is not defined 因为这里执行的RHS查询 ,在查询g的时候发现foo作用域没有,所以向他的上一级window对象内查询也没有存在,所以返回not defined
console.log(a+g);
g = a;
}
foo1(666);
function foo2(a){
g = a;
//在FOO2函数中 a向g赋值 此时g在foo2作用域中也不存在,他也向上查询,遇到window对象,发现其中也没有定义g 变量,但是此时呢他就在window对象中创建了一个g对象,所以window对象中就有这个变量
console.log(a+g); ----- 打印控制台获得 4
}
foo2(2);
//如果将foo2中 g = a 换成 a = g 会怎样呢 --- 大家可以试试哦
js之作用域的更多相关文章
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- js词法作用域规则
function foo() {console.log( a ); // 2不是3} function bar() {var a = 3;foo();} var a = 2;bar(); js中的作用 ...
- js词法作用域
作用域链和原型链是JS中比较重要的2个概念, JS的是函数作用域,与C之类语言的块级作用域不同 JS的作用域还是词法作用域,或者叫静态作用域,作用域链是在语法解析时就完成的,而不是在执行时创建. 例子 ...
- 浅谈 js eval作用域
原文:浅谈 js eval作用域 就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console. ...
- JS的作用域浅谈
作为前端小白,总是对JS的作用域有点迷糊,这里稍微研究了一下分享出来,希望和我一样的小白可以学的一点 首先是一个经典的例子: var a=0,b=0; for (var i = 0; i < 1 ...
- JS 函数作用域及变量提升那些事!
虽然看了多次js函数作用域及变量提升的理论知识,但小编也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷) ...
- js私有作用域(function(){})(); 模仿块级作用域
摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: f ...
- 浅谈js变量作用域
变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...
- 再谈js的作用域
再谈js的作用域 面试中遇到的题目: 题目一: var word = "hello world"; (function(){ alert(word); var word = ...
- js变量作用域--变量提升
1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...
随机推荐
- 29. What Makes a True Leader ? 合格的领导者由何物决定 ?
29. What Makes a True Leader ? 合格的领导者由何物决定 ? ① Reading leadership literature,you'd sometimes think t ...
- Linux IPC 之信号量
信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...
- 今天研究了一下手机通信录管理系统(C语言)
题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...
- Win7下U盘安装CentOS-7-x86_64-DVD-1503-01
转载自:http://blog.sina.com.cn/s/blog_842d5c8a0102vr12.html 昨天在Win7下装CentOS7,本以为之前装CentOS6.5很熟练了,结合网上的帖 ...
- (最小生成树)QS Network -- ZOJ --1586
链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 http://acm.hust.edu.cn/vjudge/ ...
- c++内存管理方式
概述 本章总结一些关于个人对内存管理的理解,主要包括如下内容: 内存管理原则 优秀的接口 智能指针的作用在哪里? 内存管理原则 学c++的同学都知道这个内存管理原则,就是“谁创建,谁释放”或者说“谁申 ...
- notepad++换行替换
- hdu 5033 模拟+单调优化
http://acm.hdu.edu.cn/showproblem.php?pid=5033 平面上有n个建筑,每个建筑由(xi,hi)表示,m组询问在某一个点能看到天空的视角范围大小. 维护一个凸包 ...
- hdu 5040 bfs
http://acm.hdu.edu.cn/showproblem.php?pid=5040 一个人拿着纸盒子往目的地走 正常情况下一秒走一格 可以原地不动躲在盒子里 也可以套着盒子三秒走一格 ...
- 层层递进Struts1(三)之Struts组成
这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤:获取路径.封装表单.获取转向列表.转向逻辑处理.转向,与此对应的是:ActionServlet.Act ...