题目:
- 说一下对变量提升的理解
- 说明this有几种不同的场景
- 创建10个a标签,点击的时候弹出对应序列号
- 如何理解作用域
- 实际开发中闭包的应用
———————我是思考的分界线——————————–
知识点:
1、执行上下文
2、this
3、作用域
4、作用域链
5、闭包
1、执行上下文
console.log(a) //undefined
var a = 100
fn('zhangsan') //'zhangsan' 20
function fn(name){
age = 20
console.log(name,age)
var age
}
- 范围:一段
<script>
或者一个函数(会生成一个全局的执行上下文) - 全局:变量定义,函数声明 一段
<script>
函数:变量定义,函数声明 ,this,arguments
函数声明:
function a(){}
函数表达式:var a = function(){}
this:
this要在执行时才能确认,定义时无法确认
- 作为构造函数运行
- 作为对象属性执行
- 作为普通函数执行
- call apply bind
//call
function fn(name,age){
alert(name)
console.log(this)
}
fn.call({x:100},'zhangsan',20)
//call 强制将this指向为第一个参数
fn.apply({x:100},['zhangsan',20])
//apply 强制将this指向为第一个参数第二个参数为数组
//bind
var fn = function(name,age){
alert(name)
console.log(this)
}.bind({y:200})
fn('zhangsan',20)
//定义完成用bind强制改变this指向为bind的参数
//不能用函数声明的方式.bind
作用域:
js没有块级作用域
只有函数和全局作用域
作用域链:
var a = 100
function fn (){
var b = 200
//当前作用域没有定义的变量,即'自由变量'
console.log(a)
console.log(b)
}
闭包:
闭包就是能够读取其他函数内部变量的函数
闭包的使用场景:
- 函数作为返回值
函数作为参数传递
解题:
1、说一下对变量提升的理解、变量定义 函数声明(注意函数声明和表达式的区别) 都会被放在前面。
2、 说明this有几种不同的场景
(1)、作为构造函数执行 (2)、作为对象属性 (3)、普通函数 (4)、call apply bind
3、创建10个a标签,点击的时候弹出对应序列号
var i
for( i=0; i<10; i++ ){
(function(i){
var a = document.createElement('a')
a.innerHTML = i + '<br/>'
a.addEventListener(click,function(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
})(i)
}
4、如何理解作用域
自由变量
作用域链,即自由变量的查找
闭包的两个场景
5、 实际开发中闭包的应用
封装变量,收敛权限
function isFirstLoad(){
var _list = []
return function(id){
if(_list.indexOf(id) >= 0){
return false
}else {
_list.push(id)
return true
}
}
}
//使用
var firstLoad = isFirstLoad()
firstLoad(10)//true
firstLoad(10)//false