var、let、const的区别是什么
var:var
声明的变量具有函数作用域或全局作用域。如果var
在函数外部声明,它就是全局变量;如果在函数内部声明,它就是局部变量。 var
声明的变量会被提升到其所在函数或全局作用域的顶部,但是初始化会被保留在原来的位置。
在同一个作用域中,可以使用var
多次声明同一个变量,后面的声明会覆盖前面的声明。
let:let
声明的变量具有块级作用域,即只能在包含它的代码块(例如if
语句、for
循环等)内部访问。 let
声明的变量也会被提升,但是不会初始化。在声明之前访问它会导致ReferenceError
。
在同一个作用域中,不能使用let
多次声明同一个变量。
const:const
也具有块级作用域,与let
相同。const
声明的变量同样会被提升,但是无法在声明之前访问,尝试这样做会导致ReferenceError
。
与let
一样,不能在同一个作用域中多次声明同一个const
变量。
使用const
声明的变量是只读的,这意味着一旦你为它赋值后,就不能更改它的值。但是,对于对象或数组这样的可变数据类型,你可以更改它们的内容,而不会抛出错误
call、apply和bind
call
call是函数的方法,call可以调用函数,并且噶癌变函数中的this。
1 | function fun(){ |
call的第一个参数是改变this的对象,后续参数即传给对象的参数
apply和bind
call和apply的区别仅仅是传参方式不同,call传参是从第二个参数后依次排列,apply则是将所有参数放在数组中传到apply的第二个参数
apply与call用法一致,但是apply不会调用函数,而是将函数返回后,自己再调用
1 | dog.eat.call(cat,'鱼','肉') |