今天小编给大家分享一下web前端高频知识点面试题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
var、let、const
三者的区别
区别 | let | const | var |
---|---|---|---|
重复声明 | 不能重复声明,会报SyntaxError错 | const 定义常量,值不能修改的变量叫做常量,一定要赋初始值,因为不能修改。 | 可以重复声明 |
块级作用域 | 拥有 | 拥有 | 不拥有 |
会不会污染全局变量(挂载在window上) | 不会 | 不会 | 会 |
说明
1.let和const也存在变量提升,只是提升的方式不同
-
var变量提升:变量的声明提升到顶部,值为
undefined
-
let、const变量提升: 变量声明提升到顶部,只不过将该变量标记为
尚未初始化
let 和 const存在
,代码执行过程中的一段时间内,在此期间无法使用标识符,也不能引用外层作用域的变量。暂时性死区
let answer;
function fn(){
//如果此时没有将变量变量提升到这里,answer应该取外层answer的值
console.log(answer); //Uncaught ReferenceError: Cannot access 'answer' before initialization
let answer=42;
}
2.var创建的全局变量->全局对象的属性,let和const在全局作用域声明的变量->不是全局对象的属性
3.如果常量是个数组或对象,对其内部元素修改,不算对常量的修改,不会报错。常量指向了一个地址,地址不变就不会报错。
变量提升和函数提升
变量声明升级
通过var定义(声明)的变量,在定义语句之前的就可以访问到
但是值是undefined函数声明提升
通过function声明的函数,在之前就可以直接调用。
值是函数体
//变量提升先于函数提升,提升后被函数声明function覆盖,所以就算换了顺序也是function
function a(){
}
var a ;
console.log(typeof a); //function
var f1 = function () {
console.log(1);
}
function f1 () {
console.log(2);
}
f1() ; //1
//变量提升后
var f1;//变量提升
function f1(){};//函数提升
f1 = function () {
console.log(1);
}
f1() ;
变量提升练习题
作用域和作用域链
理解:一个代码段所在的区域,是静态的,在编写代码时就确定了。
作用:变量绑定在这个作用域内有效,隔离变量,不同作用域下同名变量不会有冲突。
作用域分类
全局作用域
函数作用域
块级作用域
作用域链:多个作用域嵌套,就近选择,先在自己作用域找,然后去就近的作用域找。
函数的作用域在声明的时候就已经决定了,与调用位置无关
所以执行aaa()的时候先在aaa的作用域里面找,没有找到a,再去父级作用域window里面找,找到a=10
var a = 10;
function aaa() {
alert(a);
}
function bbb() {
var a = 20;
aaa();
}
bbb();
执行上下文
对当前JavaScript的执行环境的抽象,每当JavaScript开始执行的时候,它都在执行上下文中运行。
全局执行上下文:在执行全局代码前将window确定为全局执行上下文
对全局数据进行预处理
var定义的全局变量 --> undefined,添加为window的属性
function声明的全局函数 --> 赋值(函数体),添加为window的方法
this --> 赋值window
开始执行全局代码
函数执行上下文:在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
对局部数据进行预处理
形参变量 --> 赋值(实参)