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; ...
随机推荐
- C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...
- PythonWEB框架之Flask--3
13.请求上下文源码分析 第一阶段:将ctx(request,session)放到Local对象上 第二阶段:视图函数导入:request/session request.method -LocalP ...
- 2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)
传送门 终究还是通宵了啊... 这是一道简单的斜率优化dp. 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块. 于是剩下的土地有一条边单增,另外一条单减. 我们假设a[i]是单减的,b ...
- vs2010 EF4.0 访问mysql
需要安装mysql-connector-net-6.3.5 6.8.9的安装完后在dbfirst里找不到对应的提供程序 链接字符串里需要 指定下编码(如果不是gbk的话) <add name=& ...
- webUploader上传视频,包括上传进度、上传状态、暂停和取消等
踩坑视频上传: 点击开始上传: 头部引入webuploader.css <!DOCTYPE html> <html lang="en"> <head& ...
- Md5 util
Md5PasswordEncoder.java http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springfram ...
- 四)mybatis 二级缓存 ehcache 常见问题
1. java.io.NotSerializableException 94359 [EH_CACHE Async Replication Thread] ERROR n.s.e.d.jgroups. ...
- 如何使用C++11实现C#属性概念设计
目录(原创博客,版权所有,转载请注明出处 http://www.cnblogs.com/feng-sc) 1.概述 2.C#属性的概念 2.1.简单示例代码介绍C#中的属性 2.2.C++实现效果 ...
- c++中sort()及qsort()的用法总结
当并算法详解请见点我 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描 ...
- HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...