前端面试题

1、let const var 有什么区别?

let 声明的变量只在它所在的代码块有效;

for (let i = 0; i< 10; i++) {
    console.log(i)
}

console.log('12300')
console.log(i) // i is not defined

上面代码中,计数器 i 只在for循环体内有效,在循环体外引用就会报错。 如 var 代码:

var a = [];
for (let i = 0; i< 10; i++) {
    a[i] = function () {
        console.log(i)
    }
}
a[6]() // 10

变量i是var声明的,在全局范围内有效,所以每一次玄幻,新的i值都会覆盖旧值,导致最后输出的是最后一轮的值。

但是如果使用let ,声明的变量仅在块级作用域内有效,最后输出的是6, 如下:

var b = [];
for (let i = 0; i< 10; i++) {
    b[i] = function () {
        console.log(i)
    }
}
b[6]() // 6

不存在变量提升;

let 不想var 那样会发生变量提升,因此,变量需要先声明然后使用,否则报错;

//  var 的情况
console.log(foo)  // undefined
var foo = 2;


// let 的情况
console.log(foo) // 报错

let foo 

暂时性死区

块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响;如下代码:

var tmp = 123
if (true) {
    tmp = 'abc'
    let tmp 
    console.log(tmp) // tmp is not defined
}

上面代码定于全局变量tmp,但块级作用域内let又声明了一个局部变量tmp,导致绑定了这个块级作用域;因此console.log(tmp)会报错。

不允许重复声明

let 不允许在相同作用域内,重复声明同一个变量。如下代码

function a () {
    let a = 10
    var a = 1
    console.log(a)
}

a ()

也不能在函数内部重新声明参数。

function fun1 (index) {
    let index  // 报错
}

function fun2 (index) {
    {
        let index // 不报错
    }
}

ES6的块级作用域

function n () {

    let n = 5;
    if (true) {
        let n = 10
    }
    
    console.log(n)  // 5
}

n ()

上面的代码有2个代码块,都声明了变量n,运行输出5,说明外层代码不受内层代码块的影响,如果使用了变量var ,那么输出的就是10。

const 命令

const 声明一个只读的常量,一旦声明,常量的值就不允许改变。

const a = 1
a = 2
console.log(a) // 报错

常量一旦声明了变量,就必须初始化,不能留到以后赋值。如果使用const声明一个变量,但不赋值,也会报错;如下:

const aa ;  // 报错

const的作用域 与 let命令相同;只在声明所在的块级作用域内有效。

if (true) {
    const aa = 1
}

console.log(aa)  // 报错

不可重复声明 (和 let 一样)

var message = "Hello!"
let age = 25;

 // 以下两行都会报错

const message = "HI"
const age = 30

但是对于复合类型的变量,比如数组,存储的是一个地址,不可改变的是这个地址,既不能把一个地址指向另一个地址,但是对象本身是可变的,比如可以给它添加新的属性;如下:

const arr = []

arr.push('hello') // 可执行

arr.length = 0  // 可执行

arr = ['55']  // 报错

var 没有块级作用域

在javascript中没有块级作用域,在for()里面定义变量i ,在循环外部依然可以进行正常访问。var定义变量还有一个问题如下:

var i = 15

var i = 5

alert (i)  // 5

其中变量 i 重复定义没有报错,反而输出值为5,说明被重复写了。用var 定义变量还存在一个问题,如下:

for (var i = 0; i < 3 ; i++) {
    setTimeout (function () {
        console.log(i)    
    }, 1000)
}

输出结果为3,3,3,因为当循环结束时,i 的值为三。所以在执行setTimeout 函数时,会打印3次。(ps:如果将var 换成 let 就不会出现这个问题)

2、箭头函数和普通函数的区别

 

箭头函数中的this

默认指向在定义它时,他所处的对象,而不是执行时的对象,定义它的时候,可能环境是window(即继承父级的this)

普通函数中的this:

1. this总是代表它的直接调用者, 例如 obj.func ,那么func中的this就是obj

2.在默认情况(非严格模式下,未使用 'use strict'),没找到直接调用者,则this指的是 window

3.在严格模式下,没有直接调用者的函数中的this是 undefined

4.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值