前端面试题

发布时间:2024-11-14 22:18

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指的是 绑定的对象

网址:前端面试题 https://www.yuejiaxmz.com/news/view/76078

相关内容

【前端校招面经】快手本地生活2023前端校招面经
面试题
生活部招新面试问题
职场小油条 | 面试前必看八大经典问题!附答题模板~
hr面试性格测试30题
50个经典面试问题和答案
各类面试问题
【职场小白】面试常见问题及面试问题回答技巧
职场面试的5个基本问题
【荐读】面试常见问题及回答,面试问题回答技巧

随便看看