1.通过var定义的变量只提升声明,不提升定义(赋值)。function fn(){}声明函数,则声明和定义都被提升
2.函数提升的优先级高于变量提升,所有的函数都提升到变量之前
3.var才进行便令提升,let和const不提升,提前只用会报“reference error”,称为暂时性死区。
Js中没有用var声明的变量都是全局变量,即使是在函数里声明的,也可以在函数外面使用,而且是顶层对象的属性window.a。
严格模式下也有变量提升,但是未使用var等定义的变量不能使用,报错
"use strict"
a=1
console.log(a)
这里注意带new和.的面试题
如果是new cls.fn(),相当于new (cls.fn())
如果是new cls().fn(),相当于(new cls()).fn()
作用域:作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
作用域链就是查找变量的作用域形成的链。连带es6的块级作用域,作用域链由小到大分别是块级作用域、函数作用域、全局作用域。如果有嵌套的话像上一层嵌套查找。
可以用with来扩充作用域链
person={name:"yhb",age:22,height:175,wife:{name:"lwy",age:21}};
with(person.wife){
console.log(name);
}