(六).JavaScript的数组(2)
1.10 作用域链
- 定义:
作用域链:查找变量的过程
作用: 查找变量
查找规则:首先会在自身作用域找变量,找到就用
如果没有,就去上级作用域查找,找到就用
如果没有,一直往上找,直到全局作用域,有就用,没有就报错
作用域是一个相对概念
作用域的顶端一定是全局作用域
作用域是函数声明的时候确定的,作用域链是函数调用的时候有的,不调用不存在
作用域是虚拟的
作用域链是可见的
- 案例
var a = 0;
function fn1() {
var a = 1;
function fn2() {
var a = 2;
function fn3() {
var a = 3;
console.log(a);
}
fn3();
}
fn2();
}
fn1();
- 案例(说明作用域是在函数声明的时候确定的)
var num = 10;
function fun() {
var num = 20;
fun2();
}
function fun2() {
console.log(num);//10
}
fun();
1.11 预解析(变量提升,代码提升)
- 定义
预解析对象:①带var的变量 ②函数声明定义的函数
预解析发生时间:在js代码开始执行之前
规则:
1.先预解析函数声明定义的函数,
如果提升的时候发现函数同名,后面的函数会覆盖前面的函数
函数提升的时候整体提升
2.再去提升带var的变量,提升变量的时候变量同名,会忽略,
只提升变量名(var a),变量的值是不会提升的
3.函数表达式定义的函数,预解析规则按照带var的变量对待
var fun1 = function(){}
4.不带var的变量,不做预解析
5.函数内部也会做预解析
☆☆☆预解析完成的代码 一行一行从上至下去执行!!!
- 案例题
console.log(a);
a = 0;
--------------------------------------------------------
提升前
console.log(a);
var a = 0;
console.log(a);
提升后
var a;
console.log(a);
a = 0;
console.log(a);
--------------------------------------------------------
提升前
console.log(a);
var a = '我是变量';
function a() { console.log('我是函数') }
console.log(a);
提升后
function a() { console.log('我是函数') }
// var a 忽略
console.log(a); //打印函数本身
a = '我是变量';
console.log(a); //'我是变量'
--------------------------------------------------------
提升前
console.log(a());
var a = '我是变量';
function a() { console.log('我是函数') }
console.log(a);
提升后
function a() { console.log('我是函数') }
// var a; 失效
console.log(a()); //undefined
a = '我是变量';
console.log(a); //'我是变量'
--------------------------------------------------------
提升前
console.log(a);
var a = 0;
console.log(a);
function fn() {
console.log(a);
var a = 1;
console.log(a);
}
fn()
console.log(a);
提升后
function fn() {
var a;
console.log(a); //undefined
a = 1;
console.log(a); //1
}
var a;
console.log(a); //undefined
a = 0;
console.log(a); //0
fn();
console.log(a); //0
--------------------------------------------------------
提升前
console.log(a);
var a = 0;
console.log(a);
function fn() {
console.log(a);
a = 1;
console.log(a);
}
fn()
console.log(a);
提升后
function fn() {
console.log(a); //0
a = 1;
console.log(a); //1
}
var a;
console.log(a); //undefined
a = 0;
console.log(a); //0
fn()
console.log(a); //1
--------------------------------------------------------
提升前
console.log(a);
var a = 0;
console.log(a);
function fn() {
console.log(a);
a = 1;
console.log(a);
}
fn()
function fn() {
console.log(a);
var a = 1;
console.log(a);
}
var fn = function () {
console.log(a);
a = 1;
console.log(a);
}
fn();
var a = 100;
console.log(a);
提升后
function fn() {
console.log(a);
a = 1;
console.log(a);
}
function fn() {
var a;
console.log(a); //undefined
a = 1;
console.log(a); //1
}
var a
console.log(a); //undefined
a = 0;
console.log(a); //0
fn();
fn = function () {
console.log(a); //0
a = 1;
console.log(a); //1
}
fn();
a = 100;
console.log(a); //100
// undefined 0 undefined 1 0 1 100
1.12 js中的堆内存和栈内存
- 定义
1. js代码,首先会创建全局执行上下文环境
2. 只要函数调用 不管几次 每一个都会创建执行上下文环境
3. 基本数据类型变量名和值都放在栈内存当中
4. 对象数据类型(数组 函数 对象)在栈内存中存储的是地址,数据存储在堆内存当中
- 程序开始到结束的整个流程
1、程序一开始执行,碰见了全局环境,首先会创建全局环境并且进行压栈,全局代码执行的时候依赖的就是全局环境当中的东西;比如 全局变量(全局变量如果存的是基本数据类型,那么这个值是直接存在栈当中的,如果这个变量存的是对象类型(函数、数组),那么数据是要在堆内存当中开辟自己的空间专门存储的。然后把堆里面这块空间的地址存给栈当中的对应变量);
2、当程序执行碰到了函数调用;函数是比较特殊,因为它也可以执行;函数执行的时候也要有自己的环境去依赖。因此函数执行也是创建自己的函数环境进行压栈(函数环境一定是压在全局环境之上的),局部变量,是在函数环境当中存在的,只有函数执行,局部变量才会出现。函数执行完成以后,函数环境要弹出栈(销毁归还内存), 局部变量也就不复存在了。
3、当函数调用完成以后,会继续执行全局代码,一直到所有的代码都执行完成,代表程序执行结束,程序结束的时候,我们的全局环境最后出栈。
1.13 基本数据类型和引用数据类型
// 基本数据类型存储的是值
// 引用数据类型存储的是地址!!!
// 1.
var a = 10;
var b = a; //相当于把a身上的值(10)给了b一份 两个人都是10了
a = 20;
console.log(b);
// 2.
var arr1 = [1, 2, 3];
var arr2 = arr1; //将arr1的地址值赋值给arr2
arr2[1] = 22; //修改arr1[1]与arr2[1]的值为22
console.log(arr1);
// 3.
var arr1 = [1, 2, 3];
var arr2 = arr1; //将arr1的地址值赋值给arr2
arr2 = [1, 22, 3]; //将一个新的数组地址赋值给arr2
console.log(arr1);
// 4.
var arr1 = [];
var arr2 = [];
var arr3 = arr1;
arr3 = [];
arr3[0] = 12;
console.log(arr1, arr2, arr3); //[] [] [12]
var arr = [1, 2, 3];
var arr1 = [1, 2, 3];
// 对于引用数据类型判等来说,判别的是地址,地址一样就是true,地址不一样就是false
console.log(arr == arr1);
(六).JavaScript的数组(2)的更多相关文章
- javascript中数组Array的方法
一.常用方法(push,pop,unshift,shift,join)push pop栈方法,后进先出var a =[1,2,3];console.log(a.push(40)); //4 返回数组的 ...
- 第二章:javascript: 数组
数组是编程世界里最常见的数据结构.任何一种编程语言都包含数组,只是形式稍微有差异.数组是编程语言中的内建类型,通常效率都很高.可以满足不同需求的数据存储,本章将探索javascript中的数组工作原理 ...
- javascript中数组的常用算法深入分析
Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...
- 总结Javascript中数组各种去重的方法
相信大家都知道网上关于Javascript中数组去重的方法很多,这篇文章给大家总结Javascript中数组各种去重的方法,相信本文对大家学习和使用Javascript具有一定的参考借鉴价值,有需要的 ...
- JavaScript中数组Array.sort()排序方法详解
JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...
- JavaScript Array数组方法详解
Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...
- JavaScript从数组中删除指定值元素的方法
本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个 ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- javascript常用数组算法总结
1.数组去重 方法1: JavaScript //利用数组的indexOf方法 function unique (arr) { var result = []; for (var i = 0; i & ...
- javascript中数组的22种方法
× 目录 [1]对象继承 [2]数组转换 [3]栈和队列[4]数组排序[5]数组拼接[6]创建数组[7]数组删改[8]数组位置[9]数组归并[10]数组迭代[11]总结 前面的话 数组总共有22种方法 ...
随机推荐
- luna lunatic
Luna是罗马神话的月神.英语中Lunacy.Lunatic等意指疯狂的字语源均来自Luna.月亮的阴晴圆缺影响地球的潮汐涨退甚至生物周期,故此古时的人们相信月亮拥有使人疯狂的魔力,人狼等传说亦是因此 ...
- source 跳过登录账号的方法
1 安装 git windows 选择版本为 Git-2.29.2.2-64-bit 2 启动sourcetree 的安装 选择版本为 SourceTreeSetup-2.5.5 2.1 第一次启动 ...
- python虚拟环境和包管理
新建一个虚拟环境: python3 -m venv env1 # 新建一个名称为env1的虚拟环境 激活环境: source env1/bin/activate 退出虚拟环境: deactivate ...
- HTML基础知道了解
第1章 Html介绍 1.Html和CSS的关系 1.1 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1.2 HT ...
- Linux 查询 磁盘空间 系统报错:No space left on device
报这个错误是磁盘空间不足导致的 使用 du -h -d 1 / | sort -nr 这个命令 一级一级排查
- view 相关代码片段笔记
代码中动态创建view,并把AttributeSet加入到当前自定义的view中,动态创建属性相关 //https://blog.csdn.net/chenhuakang/article/detail ...
- PC端 图片宽度是百分比,动态设置图片高度为 6:9
我们知道图片宽度可以设置 百分比,但是高度要给一个固定值 不然不生效,并且产品要求图片显示必须是9:6,这开始确实难倒我了 后面想了一下用js 获取图片宽度 动态的计算高度就行了,超简单 se ...
- YYYY-MM-dd
Calendar calendar = Calendar.getInstance(); calendar.set(2019, Calendar.DECEMBER, 31); Date strDate ...
- tomcat 1 - Servlet 容器
Socket socket = new Socket ( "yahoo.com", 80); OutputStream os = socket.getOutputStream(); ...
- SAP 布局编辑器无法使用问题处理
因一些事情,公司将正式系统的数据拷贝到了开发机,后来在开发中用到了布局编辑器,发现打不开且会报错RFC callback call rejected by whitelist 这个是因为正式机和开发机 ...