您的位置:首页 > Web前端 > JavaScript

Javascript基础(四)作用域和闭包

2017-07-07 19:30 525 查看
题目:

说一下对变量提升的理解

说明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
95bf
,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: