jsday07

作用域

全局作用域

  • 全局作用域是最大的作用域

  • 在全局作用域中定义的变量可以在任何地方使用

  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window

  • 这个作用域会一直存在,直到页面关闭就销毁了

局部作用域

  • 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域

  • 在局部作用域中定义的变量只能在这个局部作用域内部使用

  • 在 JS 中只有函数能生成一个局部作用域,别的都不行

    • 定义在哪个作用域内的函数 就是哪个作用域的子级作用域

  • 每一个函数,都是一个局部作用域

变量使用规则

变量的定义

定义在哪个作用域下 这个变量就是哪个作用域的私有变量

只能在这个作用域下或者这个作用域的子级作用域内使用

不能在父级作用域使用

变量的访问

首先在自己的作用域查找 如果有 那么直接使用

如果没有自动到父作用域查找 父作用域有 那么就使用

如果还没有 再往上一级 直到全局作用域 发现还没有 那么 报错

xx is not defined

变量的赋值

先在自己的作用域内部查找 如果有直接赋值

如果没有自动到父作用域查找 父作用域有 那么就使用 停止查找

父作用域如果没有再往上到父级 直到 全局作用域

那么就把这个变量定义为全局变量 再进行赋值

预解析

  • js 代码的编译和执行

  • js 是一个解释型语言,就是在代码执行之前,先对代码进行通读和解释,然后在执行代码

  • js 代码在运行的时候,会经历两个环节 解释代码执行代码

解释代码

  • 在所有代码执行之前进行解释,所以叫做 预解析(预解释)

  • 需要解释的内容有两个

    1. var 声明的变量名;

    => 仅仅是对var 声明的变量提前声明 暂时不赋值

    1. 声明式的函数

    => 对函数名字提前声明 并且直接给这个函数名赋值了 一个函数

    => 赋值式的函数按照 var 变量的规则进行 解释

注意

  • 打开浏览器 只会解析全局代码

  • 不对函数内的代码进行预解析

  • 函数内的代码 仅仅会在函数调用的时候才会 预解析

预解析重名的问题

 fn();
 var fn = 100;
 fn();
 function fn(){document.write('hello,world')}
 fn();
​
 预解析 
 1.不需要
 2.声明一个fn变量 但是没有赋值 
 3.不需要
 4.需要 在浏览器声明一个fn的变量 并且直接给他赋值一个函数
 5.不需要 
​
 预解析结束 fn被声明 并且是个函数 
​
 执行阶段 
 1.fn()  正常调用 
 2.fn = 100 把变量赋值给fn()
 3.fn()
 4.fn() 
 把fn当做一个函数来调用 而fn已经是个变量了 所以
 会报错  fn is not a function 

函数两个阶段都在做什么

函数定义阶段 函数调用阶段

  • 内存

    • 栈内存 --- 基本数据类型

      • 函数名 在 栈内存

    • 堆内存 --- 复杂数据类型 引用数据类型

      • 函数体 在 堆内存

函数定义阶段

  • 1-1 先在堆内存中开辟空间

  • 1-2 把函数体内的代码 原样复制到空间内(我们写代码写在硬盘上)

  • 1-3 把内存的地址 赋值给 栈内存的函数名

函数调用阶段

  • 2-1 按照函数名存的地址去找到对应的函数体

    • 先判断栈内存中是否有这个变量

    • 如果存在 也会判断里边是否存储的还一个函数体

  • 2-2 在调用栈 内开辟一个新的 函数执行空间 (一个函数可以被多次调用为了避免一个调用出现的结果影响所有的调用,所以每次的调用都会申请一个执行空间)

  • 2-3 在执行空间内 给形参赋值

  • 2-4 在执行空间内 对函数体内的代码进行预解析

  • 2-5 在执行空间内 对函数体内的代码 执行一遍

  • 2-6 完成以后 这个执行空间被销毁 或者理解为空间被收回

递归函数

递归就是一个自己调用自己的手段

递归函数: 一个函数内部,调用了自己,循环往复

// 在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽
function fn() {
  fn()
}
fn()

递归函数和循环很类似,需要有初始化,自增,执行代码,条件判断的

死递归就是一个没有尽头的递归函数

对象

  • 对象是一个复杂数据类型 object

  • 是存储了一些基本数据类型的一个集合

var obj = {
  num: 100,
  str: 'hello world',
  boo: true
}

这里的 {} 和函数中的 {} 不一样

函数里面的是写代码的,而对象里面是写一些数据的

  • 对象就是一个键值对的集合

  • {} 里面的每一个键都是一个成员

  • 键值对的集合 键和值之间: 键值对之间逗号隔开

创建对象

字面量的方式创建一个对象

// 创建一个空对象
var obj = {}
​
// 像对象中添加成员
obj.name = 'Jack'
obj.age = 18

内置构造函数的方式创建对象

// 创建一个空对象
var obj = new Object()
// Object 是 js 内置给我们的构造函数,用于创建一个对象使用的
// 向对象中添加成员
obj.name = 'Rose'
obj.age = 20

注意

键的名字按照变量的命名规则 规范 不要有重复 后边 会覆盖前面

可以使用纯数字 作为键名 自动把数字排到最前面

可以使用特殊符号作为键名

键的 可加单引号 可不加单引号 但是如果用特殊符号作为键名 必须加单引号

建议使用字符串作为键名

 var wangzhen = {
      'username': 'wangzhen',
       love: function () {
            console.log('过了这个村我在下个村等你')
       }
 } 
 alert(typeof wangzhen) // object
 alert(wangzhen.username) // 查看静态属性不用加()
 wangzhen.love() // 调用动态方法 需要加() 

对象的操作

 var jianzeng = {
     name:'jiangjiang',
     age:18,
     ball:function(){
         return '白巧克力'
     }
 }

 jianzeng.height = '181cm';
 alert(jianzeng.height)

 alert(jianzeng.age);
 delete jianzeng.age;
 alert(jianzeng.age);

//重新赋值就是改的过程 
 alert(jianzeng.name);
 jianzeng.name = 'xiaojiang'
 alert(jianzeng.name);

 alert(jianzeng.age) // 查看静态属性
 alert(jianzeng.ball())//调用动态方法 

注意

  • 当对象的键名字中有 纯数字 特殊符号

  • 这个时候 增删改查 要使用 中括号的方式巧用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值