代码运行时代码声明和函数会被提前(即变量提升)
console.log(a)//undefined
var a = 200
上面的代码打印结果是undefined,原因是上面的代码等同于下面的写法
var a = undefined
console.log(a)//undefined
a = 200
同理这种写法
//函数声明 这种写法在 声明前后调用都可以
function fun(){}
//函数表达式 这种写法 只能在 声明后调用都可以
var fun1 = function(){}
相当于
var fun1 = undefined
//函数声明 这种写法在 声明前后调用都可以
function fun(){}
//函数表达式 这种写法 只能在 声明后调用都可以
fun1 = function(){}
因此在 var fun1前调用 fun1()时会报错
以下代码运行结果同理
console.log(a)// undefined
var a = 200
fun('zheng')
function fun(name){
age = 20
console.log(name,age)//zheng 20
var age
}
//上面的代码相当于下面的代码
var a = undefined //变量a提前
function fun(name){// fun提前
var age = undefined//age提前
age = 20
console.log(name,age)//zheng 20
}
console.log(a)// undefined
a = 200
fun('zheng')
this在执行时才能确定,定义时无法确定
var a = {
name:'B',
fn:function(){
console.log(this.name)
}
}
a.fn() // B
a.fn.call({name:'C'}) // C
var fn1 = a.fn
fn1()// undefined
this在普通函数中指向window
function fun(){
console.log(this===window)
}
fun()
作用域
js没有块级作用域只有全局作用域和函数作用域
if (true) {
var hasData = true
}
console.log(hasData)//true
var num = 100
function fun(){
var num2 = 200
console.log(num)//100
console.log(num2)//200
}
console.log(num)//100
fun()
console.log(num2)//undefined
闭包
闭包有两种情景
情景一:
function fun(){
var a = 2
return function(){
console.log(a)
}
}
var f = fun()
var a = 6
f()// 2
情景二:
function fun(){
var a = 2
return function(){
console.log(a)
}
}
var f = fun()
function fun2(f) {
var a = 6
f()// 2
}