变量晋升
JS引擎的工作形式:先解析代码,获取所有被申明的变量,而后再一行一行的运行
console.log(a) // undefined var a = 2
相当于
var aconsole.log(a)a = 2
这就是变量晋升
函数申明也会晋升,并且优先于表达式
getName() // 1 function getName() { console.log('1')}var getName = function() { console.log('2')}getName() // 2
暂时性死区
ES6的let\const
不会变量晋升
typeof a // ReferenceError: a is not definedlet a
因为let
不会变量晋升,所以在申明前调用会报错
let x = 'outer value'!(function(){ console.log(x) // Cannot access 'x' before initialization let x = 'inner value'})()
ES6规定,let/const
命令会使区块造成关闭的作用域,在这个作用域下,从进入到变量能够拜访之间的一段时间,就称之为暂时性死区,在暂时性死区,该变量都是不可用的
this指向
- 独自应用,指向全局对象
window
,严格模式下,指向undefined
函数外部,函数执行时能力确定
function f() { var user = "星辰大海"; console.log(this.user); // undfined console.log(this); // Window }f();
办法中,this指向调用办法的对象
var a = 18; var obj = { a: 19, b: { a: 20, c: function () { console.log(this.a); } } } obj.b.c(); // 20