JS关于作用域和闭包的理解

说一下对变量提升的理解

  •   变量定义
  •   函数声明(注意和函数表达式的区别)

说明this几种不同的使用场景

  • 作为构造函数执行
  • 作为对象属性执行
  • 作为普通函数执行
  • call apply bind

创建10个<a>标签,点击的时候弹出来对应的序号

var i

for(i=0;i<10;i++){
    (function(i){
        var a = document.createElemnet('a')
        a.innerHTML = i + '<br>'
        a.addEventListenter('click',function(e){
            e.preventDefault()
            alert(i)
        })
        document.body.appendChild(a)
    })(i)
}

如何理解作用域

  • 自由变量
  • 作用域链,即自由变量的查找
  • 闭包的两个场景(示例代码在下方)

实际开发中闭包的应用

//闭包实际应用中主要用于封装变量,收敛权限
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
firstLoad (20)  //true

 

知识点

执行上下文

  • 范围:一段<script>或者一个函数
  • 全局:变量定义、函数声明
  • 函数:变量定义、函数声明、this、argumentsps:

 ps:注意‘函数声明‘和‘函数表达式的区别

this

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
  • 作为构造函数执行
  • 作为对象属性执行
  • 作为普通函数执行
  • call apply bind
// call apply bind
function fn1 (name,age){
    alert(name)
}
fn1.call({x:100},'zhangsan',20)  //this === {x:100}
fn1.apply({x:100},['zhangsan',20])  //this === {x:100}
var fn2 = function (name,age){
    alert(name)
    console.log(this)
}.bind({y:20})

fn2('zhangsan',20) //this === {y:20}

 作用域

  • 没有块级作用域
  • 只有函数和全局作用域

闭包的使用场景 

  • 函数作为返回值
  • function F1 (){
        var a = 100
        return function (){
            console.log(a)  //自由变量,父作用域寻找
        }
    }
    
    var f1 = F1()
    var a = 200
    f1() //100

     

  • 函数作为参数来传递
  • function F1(){
        var a = 100
        return function(){
            console.log(a)//自由变量,父作用域寻找
        }
    }
    var f1 = F1()
    function F2(fn){
        var a = 200
        fn()
    }
    F2(f1) //100

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值