作用域和闭包
问题:
- 对变量提升的理解
- 说明this几种不同的使用场景
- 创建10个<a>标签,点击的时候弹出对应的序号
- 如何理解作用域
- 实际开发中闭包的应用
知识点:
- 执行上下文
- 范围:一段<script>或者一个函数
- 全局:变量定义、函数声明 一段<script> 执行前
- 函数:变量定义、函数声明、this、arguments 函数 执行前
注意“函数声明” function fn(){...}[会被前置] 和“函数表达式”的区别 var fn= function {...}
- this
- this要在执行时才能确认值,定义时无法确认
var a = {
name:'A',
fn:function(){
console.log(this.name)
}
}
//定义,什么时候执行,什么时候报错
a.fn() //this===a 执行结构 A
a.fn.call({name:'B'}) //this==={name:'B'} 执行结果 B
var fn1 = a.fn
fn1() //this===window 执行结果undefined
/*this的执行场景*/
1.作为构造函数执行
function Foo(name){//this={};this.name = name;//return this};var f = new Foo('zhangsan')
2.作为对象属性执行
var obj = {name:'A',printName:function(){console.log(this.name)}};obj.printName()
3.作为普通函数执行 window
function fn(){console.log(this)};fn()
4.call apply bind
function fn1(name,age){alert(name);console.log(this)};fn1.call({x:100},'zhangsan')
//alert zhangsan, this==={x:100}
apply 传递参数的方式不同
var fn2 = function(name,age){alert(name);console.log(this)}.bind({y:200});fn2('zhangsan',20)
//alert zhangsan,this==={y:200}
- 作用域
- JS没有块级作用域
- 只有函数和全局作用域
- 作用域链

函数在哪里定义,父级作用域就在哪里
- 闭包
function F1(){
var a=100
//返回一个函数(函数作为返回值)
return function(){
console.log(a)
}
}
//f1得到一个函数
var f1=F1()
var a=200
f1() //100
闭包的使用场景
- 函数作为返回值(demo)
- 函数作为参数传递
定义时的父级作用域
function F1(){
var a=100
return function(){
console.log(a)
}
}
var f1 = F1()
function F2(fn){
var a=200
fn()
}
F2(f1) //100
问题:
- 对变量提升的理解
变量定义
函数声明(注意和函数表达式的区别)
- 说明this几种不同的使用场景
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
- 创建10个<a>标签,点击的时候弹出对应的序号

自执行函数,就是不用调用,只要定义完成,立即执行的函数
i 在函数作用域内
- 如何理解作用域
自由变量
作用域链,即自由变量的查找
闭包的两个场景
- 实际开发中闭包的应用

浙公网安备 33010602011771号