问题:
- 对变量提升的理解
- 说明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 执行结构 Aa.fn.call({name:'B'}) //this==={name:'B'} 执行结果 Bvar fn1 = a.fnfn1() //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=200f1() //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 在函数作用域内
- 如何理解作用域
自由变量
作用域链,即自由变量的查找
闭包的两个场景
- 实际开发中闭包的应用