作用域概述:
通常来说 : 一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
作用域有三种 :
1. 全局作用域【全局有效】 :作用与所有代码的执行的环境(整个script标签内部) 或者一个独立的js文件
2.局部作用域 【局部有效】:作用于函数内的代码环境,就是局部作用域,因为跟函数有关系也称为函数作用域。
3.块级作用域 【{}内有效】 :块作用域由{}包括,if语句和for语句里面的{}等
2.变量的作用域
在javascript中,根据作用域的不同 ,变量可分为
1.全局变量: [函数外的let变量] 全局变量在任何区域都可以访问和修改
2.局部变量: 【函数内部的let变量】局部变量只能在当前函数内被修改和访问
3.块级变量: 【{}内部的let变量】 let定义的变量在能在块作用域里访问,不能跨块访问,也不能跨函数访问
3.变量的作用域
变量只有一个坑
如果函数内部或者块级作用域内部 ,变量没有声明,直接赋值,也可以当全局变量使用,但是不推荐。
但是有一种情况 函数内的形参可以看作是局部变量
//如果在函数内的变量没有被声明直接当全局变量来看
function hell() {
num = 10;
}
hell();
console.log(num);
if (true) {
num2 = 20;
}
console.log(num2);
3.变量访问原则-作用域链
1.只要是代码,就至少有一个作用域
2.写在函数内部的是局部作用域
3.如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域
4.根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
作用域链:采用就近原则的方式来查找变量最终的值
代码演示
function fn() {
let num = 10 ;
function fn2() {
let num = 123;
console.log(num);
}
fn2();
}
let num = 456;
fn(); //调用fn函数
//控制台最后输出是123
函数:
对象(object):javascript里面的一种数据类型。 【可以理解为是一种无序的数据集合】
(理解):
对象用来描述某个事物,例如描述一个人
人有姓名,年龄,性别等信息,还有吃饭睡觉等功能。
如果用变量来保存这些信息就比较零散,用对象比较统一
对象声明语法:
let 对象名 {}
对象由属性和方法组成(举个例子)
属性:信息或叫特征(类似css里面的属性) 比如手机尺寸,颜色,重量。
方法:功能或叫行为 比如:手机打电话,发短信,玩游戏。
let person = {
username: 'andy',
password: '123456',
sex: '男',
sayhi: function() {
console.log('hi');
}
}
//属性都是成对出现的,包括属性名和值,他们之间用英文:隔开
//多个属性之间用,分隔
//属性就是依附在对象上的变量(外面是变量,对象内就叫属性)
//属性名可以使用“”或'',一般情况下省略,除非名称遇到特殊符号空格,中划线等.
案例:
let phone = {
goods : '小米(mi)', //产品信息
name : '小米小米10青春版', //名字
num : '1020102010', //编号
weight : '0.55g', //重量
address : '中国大陆' //产地
}
4.属性访问
声明对象,并添加若干属性后,可以使用,或[]获得对象中属性对应的值,我称之为属性访问。简单理解就是获得对象里面的属性值
操作对象
查询对象: 对象.属性 或者 对象['属性'] 对象.方法()
重新赋值:对象.属性 = 值
对象.方法 = function() {
}
对象添加新的数据:
对象名.新属性名 = 新值
删除对象 :
delete 对象名.属性名
遍历对象
对象没有像数组一样的length属性,所以无法确定长度
对象里面是无序的键值对,没有规律,不像数组里面有规律的下标。
let obj = {
uname : '小明',
age : 18,
sex : '男'
}
//for in 循环语句
//语法
//k 是变量 k 或者 key value
for(k in obj) {
console.log(obj[k]); //属性名
}