声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程;文中引用了经过个人加工的其它作者的内容,并非原创。学海无涯

什么是作用域

  作用域就是一套规则,用于确定在何处以及如何查找变量(标识符)的规则

  伪代码帮助理解

function foo() {
var a = 'ice';
console.log(a);
}
foo();

  执行函数foo,打印变量a,这个a从哪来呢? 很显然有一句:“var a = 'ice'” 声明了一个变量a,并赋值为‘ice’;

  再来一段不一样的

var a = 'ice';
function foo() {
console.log(a);
}
foo();

  按照之前的规则,此时函数foo内部并没有变量a的声明,那a是从哪来的呢?答案是在全局作用域中有“var a = 'ice'”的声明,从这里查找到了a

  通俗得讲,作用域就是查找变量的地方

有哪些种类作用域

  便于理解但不一定准确得说:作用域按照查找规则来说分为词法作用域(静态作用域)和动态作用域

  词法作用域:定义在词法阶段的作用域;换句话说就是在代码书写完时,作用域就确定了;

  动态作用域:代码执行(函数执行)的时候才确定的作用域;与代码的书写位置无关;

  伪代码来分析一下这两种作用域的不同

var val = 1;
function foo() {
console.log(val);
} function bar() {
var val = 2;
foo();
} bar();

  如果javascript使用的是动态作用域

    执行bar函数时bar函数内部声明了‘val’变量并赋值为2,执行foo函数,打印val变量,在foo内部查找val,如果没有则查找的是位于bar函数内部的val变量,故打印2;

  如果javascript使用的是词法作用域

    声明全局变量val、函数foo、函数bar;函数foo内使用到了变量val,在其内部没有找到则根据书写位置向外层查找到全局作用域中的val;故打印1;

  其实经过我们实际验证,结果是打印1,也就是说javascript使用的是词法作用域

  按照作用域的作用范围分为:全局作用域、函数作用域块级作用域

  同样通过代码展现

var val = 1; // 全局作用域

function foo() {
var val = 2; // 函数作用域 if(true) {
let val = 3; // 块级作用域(es6引入)
}
} // 另外几种形式的块级作用域
var obj = {a: 'aa', b: 'bb'};
with(obj) {
a = 'aaa';
c = 'ccc';
console.log(a, c); // 'aaa', 'ccc'
}
console.log(a); // Uncaught ReferenceError: a is not defined
console.log(c); // 'ccc’ with中的c被泄露到了全局变量 var e = 'default';
try{
var temp = 1;
throw(456);
} catch(e) {
var e;
var x = 123;
console.log(e); // 456 对于e来说是catch块中的局部变量
console.log(delete e); // false e不可使用delete移除
console.log(x); //
e = 789;
console.log(e); // 789重新赋值e
}
console.log(temp); // try并不会重新创建块级作用域
console.log(e); // ‘default’ catch中对e的重新声明赋值并没有影响全局中的e
console.log(x); // 123

最后一个思考题,回顾作用域

var zoo = 'global';
function foo() {
var zoo = 'local';
function bar() {
return zoo;
}
return bar();
}
foo(); // 执行结果‘local’ var zoo = 'global';
function foo() {
var zoo = 'local';
function bar() {
return zoo;
}
return bar;
}
foo()(); // 执行结果‘local’

js基础系列之【作用域】的更多相关文章

  1. JS基础知识(作用域/垃圾管理)

    1.js没有块级作用域 if (true) { var color = “blue”; } alert(color); //”blue” for (var i=0; i < 10; i++){ ...

  2. JS基础篇之作用域、执行上下文、this、闭包

    前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...

  3. js基础系列框架:JS重要知识点(转载)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  4. JS进阶系列之作用域链

    在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象.确定作用域链还有确定this的指向,本次将重点讲解一下作用域链. JavaScript代码的执行过程 在讲解作用域链之前,首先了解一 ...

  5. JS基础_全局作用域

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. js基础之--变量 作用域和内存问题

    基本类型:Undefind Null Boolean Number String 引用类型: 对象 在操作对象时,实际上实在操作对象的引用而不是实际的对象.为此,引用类型的值是按引用访问的. 从一个变 ...

  7. js基础系列之【原型和原型链】

    声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程:文中引用了经过个人加工的其它作者的内容,并非原创.学海无涯 引入问题 一般我们是这样写的: (需求驱动技术,疑问驱动进步) // 构 ...

  8. Js基础知识(作用域、特殊函数---自调、回调、作为值的函数)

    15.作用域 概念: 规定变量或函数的可被访问的范围和生命周期 分类: 全局作用域 -就是指当前整个页面环境: 局部作用域(函数作用域) -就是指某个函数内部环境 l 变量的作用域 全局变量 - 定义 ...

  9. JS基础_函数作用域

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. JAVA的原子性和可见性,线程同步的理解

    1.原子性 (1)原子是构成物质的基本单位(当然电子等暂且不论),所以原子的意思代表着——“不可分”: (2)原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它 ...

  2. 基于FastJson的通用泛型解决方案

    由于项目使用的是fastjson,也无法换成其他的序列化框架,所以研究了一下他对泛型序列化和反序列化的支持能力,最终解决了这个问题. 要达成的目标 我的封装方式属于通用封装,我要达到的目标是如下的使用 ...

  3. Component(组件)

    1.Component是一个模板的控制类用于处理应用和逻辑页面的视图部分. 2.Component时Angular2应用最基础的建筑砖块. 3.任何一个Component都是NgModule的一部分, ...

  4. jvm内存溢出问题

     Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 J ...

  5. caffe matlab matcaffe 加载输入网络net时报错

    http://blog.csdn.net/xiaojiajia007/article/details/72850247

  6. 学习java的第4天 (2019-03-21 11:49)

    学习java的第4天       好文要顶 关注我 收藏该文   里里零关注 - 0粉丝 - 0       0 0         posted on 2019-03-21 11:49 编辑 抱歉! ...

  7. wire [7:0] regAddr; 理解

    首先要指出的是wire[7,0]a和wire[8,1]a这样的表达在verilog中是错误的,应该写成wire[7:0]a和wire[8:1]a wire[7:0]a表示定义了一个wire型数据,该数 ...

  8. scrapy初探(一)-斗鱼TV直播信息抓取

    由于有相关需求,最近两天开始学了一下scrapy 这次我们就以爬取斗鱼直播间为例,我们准备爬取斗鱼所有的在线直播信息, 包括1.主播昵称 2.直播领域 3.所在页面数 4.直播观看人数 5.直播间ur ...

  9. Centos系统下 Gitolite安装与相关配置(git权限控制软件)

     确保已经安装了最新版的git服务Git源码安装 Linux指定安装目录,并且创建了 用户名为git 的账户 修改.gitolite.rc #设置gitolite管理的仓库目录 GL_REPO_BAS ...

  10. #电脑磁盘分区#新买的电脑一般只有C盘或者C盘和D盘,怎么加多几个盘呢

    新买的电脑一般只有C盘或者C盘和D盘,怎么加多几个盘呢 鼠标右键点击桌面我的电脑选择管理 进入计算机管理.选择磁盘管理 若桌面没有我的电脑,可按win+x键,在快捷菜单栏中点击磁盘管理 通过以上两种w ...