前端面经每日一题Day15
1.作用域链
当JavaScript引擎需要查找一个变量的值时,它会沿着作用域链向上查找,从当前作用域开始,逐级向上查找,直到找到变量或者达到全局作用域。
作用域链是由当前作用域和所有父级作用域组成的一个链式结构。
let x=11
function fn1(){
let y=22
function fn2(){
let z=33
console.log('x',x,'y',y,'z',z) //11,22,33
}
fn2()
}
fn1()
2.变量提升
变量或者函数的声明,在代码执行之前,会被提升到它们各自作用域的顶部。这里的提升仅仅是声明被提升,变量的赋值并没有被提升。
变量声明提升:var关键字声明的变量,会被提升到作用域的顶部,但变量的赋值不会被提升。
函数声明提升,函数的声明也会被提升到作用域顶部,但是和变量声明的区别就是,函数声明的函数体和参数都会被提升。
var声明的变量可以变量提升,let,const声明的变量不可以变量提升。
console.log(a); // 输出: undefined(因为变量声明被提升,但赋值没有)
var a = 2;
function foo() {
console.log(b); // 输出: function foo() { ... }(因为函数声明被完全提升)
var b = 3;
function b() {
console.log("This is function b");
}
}
foo();
3.原型,构造函数,实例
原型Prototype:可以理解为该对象的爹,允许对象继承其他对象的属性和方法。在JavaScript中,每个对象都包含__**proto__**
属性指向该对象的原型对象。对象的属性和方法通过原型链实现继承。
构造函数Constructor:特殊的函数,用于创建和初始化对象。
过程:使用new
关键字和构造函数时,JavaScript
会创建一个新的空对象,并将这个新对象的内部原型__proto__
设置为构造函数prototype
属性引用的对象,构造函数内部的this
关键字会被绑定到这个新对象上,你可以在构造函数内部为新对象添加属性和方法。
实例Instance:通过new关键字和构造函数创建出来的对象就是实例。每个实例都会继承构造函数原型对象上的属性和方法
// 构造函数
function Person(name,age){
this.name=name
this.age=age
this.sayName=function(){
console.log(`hello,my name is ${this.name}`)
}
}
// 原型方法
Person.prototype.sayAge=function(){
console.log(`hello,my age is ${this.age}`)
}
// 创建实例对象
let per1=new Person('jack',12)
per1.sayAge()
per1.sayName()