第三部分 作用域和闭包
对应知识点
1、执行上下文
变量提升
(1)JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
(2)JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
(3)声明提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
console.log(a) // undefined
var a = 10;
fn('zhansan') // 'zhansan' 20
function fn(name) {
age = 20;
console.log(name, age)
var age
}
**范围:**一段 script 或者一个函数
全局: (全局上下文) 变量声明定义、函数声明
函数: (函数上下文) 变量声明定义、函数声明、this、arguments(函数参数集合)
注意:“函数声明” 和 “函数表达式” 的区别
2、this
(1)this 要在执行时才能确认值,定义时无法确认值
var a = {
name: 'A',
fn: function () {
console.log(this.name)
}
}
a.fn() // this 指向 a 这个对象
a.fn.call({
name: 'B' }) // this 指向 {name:'B'}
var fn1 = a.fn;
fn1() // this 指向 window
(2)作为构造函数执行
this 指向 new 出来的对象 f
// 作为构造函数执行
function Foo(name, age) {
// this = {}
this.age = age
this.name = name;
// return this
console.log(this, '构造函数this') // this 指向 new 出来的对象 f
}
var f = new Foo('zhangsan', 20)
(3)作为对象属性执行
this 指向该属性所属的对象 obj
// 作为对象属性执行
var obj = {
name: 'lisi',
printName: function () {
console.log(this.name)
console.log(this) // this 指向该属性所属的对象 obj
}
}
obj.printName()
(4)作为普通函数执行
this 指向 window对象
// 作为普通函数执行
function fn