面试题-js


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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function fun(){
console.log(this.name)
}

let cat = {
name: "大橘"
}

fun.call(cat)// 大橘

let dog = {
name: "旺财",
sayName(){
console.log("我是"+this.name)
}
}

dog.sayName.call(cat)//我是大橘

call的第一个参数是改变this的对象,后续参数即传给对象的参数

apply和bind

call和apply的区别仅仅是传参方式不同,call传参是从第二个参数后依次排列,apply则是将所有参数放在数组中传到apply的第二个参数

apply与call用法一致,但是apply不会调用函数,而是将函数返回后,自己再调用

1
2
3
4
dog.eat.call(cat,'鱼''肉')
dog.eat.apply(cat,['鱼''肉'])
let fun = dog.eat.bind(cat,'鱼''肉')
fun()