作用域
- 什么是作用域?
- 简答一句话概述:变量生效的范围
- 变量不是在所有地方都是可以使用的,而这个变量的可使用范围 就是作用域
全局作用域 && 局部作用域
作用域链
- 作用域链是一个纯概念性的东西
- 当我们在某一个作用域内获取某一个变量时
- 会先在当前作用域查找,找到直接拿来用,没找到会向上层查找
- 如果上层作用域也没找到,那么会继续向上层作用域的上层作用域查找,一直到查找到全局作用域
- 这样一层一层向上查找构成一个链条(假设有,不是真的有链条),我们叫做作用域链
var num = 100;
function fn() {
var num2 = 200
function fun() {
var num3 = 300
console.log(num3)
console.log(num2)
console.log(num)
console.log(a)
}
}
变量使用规则
访问规则
function fn() {
var num = 100
}
fn()
console.log(num)
赋值规则
- 当我们想要给某一个变量赋值的时候,就要先找到这个变量,然后再给它赋值
- 赋值规则
- 先在自己作用域内部查找,有就直接赋值
- 没有就去上一级作用域内部查找,有就直接赋值,如果没有继续向上一级作用域内部查找
- 如果一直找到全局作用域都没有,那么就把这个变量定义为全局变量,再给他赋值
function fn() {
num = 100
}
fn()
递归函数
- 什么是递归?
- 在编程世界中,递归就是一个自己调用自己的手段
- 递归函数:在一个函数内部,调用了自己,循环往复
function fn() {
fn()
}
fn()
- 其实递归函数和循环很类似
- 需要有初始化,自增,执行代码,条件判断
- 如果没有就会是一个没有尽头的递归函数,我们通常叫这种为 死递归
写一个简单的递归
function add (n) {
if (n == 5) {
return 5
}
}
add(1)
function add (n) {
if (n == 5) {
return 5
} else {
return n + add(n + 1)
}
}
add(1)
简单了解对象
- 什么是对象
- 首先排除男女朋友, 我们这是正经编程
- 对象是一个 复杂数据类型, 也叫做 引用数据类型
- 虽然我们说是复杂类型, 但是也没有很复杂, 只不过是存储了一些基本数据类型的集合
var obj = {
num: 100,
str: 'hello',
boo: true
}
- 这里的 {} 和函数中的 {} 不一样, 函数内部书写代码, 对象里面是书写数据的
- 对象就是一个键值对的集合
- 什么是键值对?
- 对象 obj 中, num 是键, 100 是值
- 对象 obj 中, str 是键, 'hello' 是值
- 对象 obj 中, boo 是键, true 是值
- 其实就是我们准备一个房子, 把我们想要的数据放进去, 然后把房子的地址给到变量名, 当我们需要某一个数据的时候, 就可以根据变量名里面存储的地址找到对应的房子, 然后去房子里面找到对应的数据
创建对象* 字面量方式创建对象
* 语法:`var obj = {} var obj1 = {键值对, 键值对}`
- 内置构造函数创建
- 语法:
var obj = new Object()
- 对象内对于 键(key) 的要求
- 推荐使用符合变量命名规则和规范的名字
- 可以使用纯数字当作 键名
- 可以使用任何特殊符号
对象数据类型的操作(增删改查)两种语法
- 点语法
var obj = {}
obj.name = 'qianfeng'
obj.name = 'qianfeng123'
console.log(obj.name)
delete obj.name
- 中括号语法(数组语法)
var obj = {}
obj['name'] = 'qianfeng'
obj['name'] = 'qianfeng123123'
console.log(obj['name'])
delete obj['name']
- 两者的差异
- 符合变量命名规范与规则的情况,两者并无差异
- 操作不符合变量命名规范与规则的名称时,比如纯数字或者带有特殊符号的,就只能用中括号语法
- 涉及变量相关的时候,只能使用中括号语法
for in 循环遍历对象
for (var k in obj) {
console.log('我执行了', k, obj[k])
}
数据类型赋值的区别
- 基本数据类型:赋值以后,两个变量没有关系了
- 复杂数据类型:赋值以后,两个变量操作一个存储空间
- 两种数据类型存储的区别
- 基础数据类型直接存储在 栈内存中
- 复杂数据类型会将数据本体存在堆内存中,变量名存储在堆内存中,变量名内部存储着指向堆内存的地址
数组数据类型
创建数组数据类型
数组的 length 属性
数组的 索引 概念
for 循环遍历数组
不同数据类型的存储(堆和栈)