①作用域
数据起作用的区域
在js中函数和对象也是变量
作用域为可访问变量,对象和函数的集合
作用域可以这样理解他的最大功能就是隔离变量,不同作用域下同名变量不会起冲突
1.全局作用域
全局作用域还分为所有地方都能访问的真全局作用域和某一块内可以访问的局部作用域
在函数外定义的就是全局变量,全局变量有全局作用域,在所有函数都可用
windows内置的所有属性都属于全局作用域
所欲未定义直接赋值的变量自动声明为拥有全局作用域
局部变量只能在函数内部访问
局部变量在开始执行时创建,执行完后销毁
2.块级作用域
分别有if块,while块,函数块,for循环块,单独{}块.
在不用var的情况下下级作用域可以访问下级作用域的数据,但是上级作用域不能访问下级作用域的数据
优先级:局部优先,函数次之,全局最次
全局数据一直存在,块级内的在执行时创建,执行完后销毁
内层作用域可以访问外层反之则不行
②let,var和const
let声明的变量只在let命令所在的代码块内有效
const声明一个只读的常量,一旦声明常量的值就不能改变
const用于声明一个或多个常量,声明时必须进行初始化,且初始化后不可再修改
const w
w = 1 //错误写法
const w = 1 //正确写法
let和const有相同点:二者都是块级作用域,都不能和他所在作用域的其他变量和函数有相同的名称
二者还是有区别的const声明的常量必须初始化,而let不用.const声明的常量不能修改也不能再次声明,而let的变量可以修改
const的本质:const定义的变量并非常量,并非不可变,它定义了一个常量引用一个值.使用const定义的对象或者数组,其实是可变的(但是不能对常量重新赋值)
//创建常量对象
const wo = {age="15",name="wang",color="white"};
//修改属性
wo.color = "black";
//添加属性
wo.height = 90;
const定义的变量不可以先使用再声明
var有一个弊端会影响全局变量的风险,在块内声明的变量还会重新声明块外的变量而let不会有这个问题他只会声明块内的变量,(老浏览器可能不支持let)
暂时性死区
和var相比,let和const声明的变量不会被提升到作用域顶端,即使用相对安全的typeof也会出现错误
console.log(typeof value)
let value = "yuyue"
上面的例子中,此时console.log(typeof)会抛出错误,是因为用let定义并初始化的语句是不会执行,此时的value还处于JavaScript所谓的暂时性死区(temporal dead zone)简称为TDZ中,虽然JavaScript没有明确标准TDZ,但是人们常用它描述let和const定义的变量不会被提升.
我们来说一下TDZ工作原理,JavaScript引擎在扫描代码时发现声明变量时,如果遇到var就会把它提升到当前作用域顶端,如果遇到let或const就会把声明放到TDZ中,如果访问TDZ中的变量就会抛出错误,只有执行完TDZ中的变量才会将他移出,然后就可以正常方法了,这机制只会在当前作用域生效
一看就懂的var、let、const三者区别 - 掘金 (juejin.cn)
function
用于创建函数数据:函数也是数据,但他又功能
function用于声明一个函数,函数声明后我们可以在有需要时调用(使用return返回函数的值)
语法
function name(参数){
执行的代码
}
同时JavaScript函数可定义为一个表达式,函数表达式可保存在变量中
let a =function(){}去声明
函数表达式
另一种创建函数的语法成为函数表达式,它允许我们在任何表达式中间创建一个函数
function sayHi(){
alert("hello");
}
let sayHi =function(){
alert("hello");
};
注意在另一种写法上function后面没有函数名,函数表达式允许省略函数名,这里我们立即赋值给变量,所以上面两种方法的含义是一样的
函数是一个值
重申:无论函数怎么创建他依旧是一个值,上面两个示例都在sayHi变量中储存了一个函数