美文网首页
JS作用域和闭包

JS作用域和闭包

作者: lzb30 | 来源:发表于2018-01-04 17:31 被阅读0次

执行上下文

变量定义 var a= 100
函数声明 function fn1(){}
函数表达式 var fn1 = function(){}

在一个作用域内,会先定义变量和函数声明。但在执行变量声明和函数表达式时,会先声明这个变量,然后赋值为undefined,再按代码顺序执行。

var  a = 100;
fn1();
function  fn1(){}
fn2();
var fn2 = function(){}

代码的执行顺序是

var  a = undefined;
function fn1(){}
var fn2 = undefined;
fn1();
fn2();
fn2 = function(){}

this

this要在执行时才能确认值,定义时无法确认

this的使用场景

作为构造函数执行

function Foo(name){
     // this = {};
     this.name = name;
     // return this;
}
var f = new Foo();

作为对象属性执行
做为普通函数执行

function fn(){ console.log(this); }    //this === window
fn();

改变this的三个函数:call apply bind

function fn1(name){ console.log(this); }

fn1.call({num:100}, 'zhangsan');       //this === {num: 100}     最常用
fn1.apply({num:100}, ['zhangsan']);  //与call的区别是传递参数的方式不一样

var fn2 = function(name){
     console.log(this);          //this ===  {aa:100}
}.bind({aa:100});                //bind只能用函数表达式,不能用函数声明

fn2('zhangsan');

作用域

没有块级作用域
只有函数和全局作用域
当前作用域没有定义的变量,即“自由变量”

闭包

闭包的使用场景

函数做为返回值
function f1(){
     var a = 100;
     return  function (){ console.log(a); }          // a是自由变量,父作用域寻找
}
var f = f1();
var a = 200;
f();
函数做为参数传递
var a = 100;

function f1(){
     return  function (){ console.log(a); }          // a是自由变量,只从声明变量的父作用域寻找,跟执行的作用域无关
}
var f = f1();

function f2(fn){
     var a = 200;
     fn();
}

f2(f);

解题

说一下对变量提升的理解

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

创建10个a标签,点击的时候弹出来对应的序号
var i, a
for(i=0; i<10; i++){
     a = document.createElement('a');
     a.innerHTML = i + '<br>';
     a.addEventListener('click', function(e){
          e.preventDefault();
          alert(i)                         //无论点哪个都会显示10
     })
     document.body.append(a);
}
//正确做法
for(i=0; i<10; i++){
     (function(i){
          a = document.createElement('a');
          a.innerHTML = i + '<br>';
          a.addEventListener('click', function(e){
               e.preventDefault();
               alert(i)
          })
          document.body.append(a);
     })(i)
}
如何理解作用域

自由变量
作用域链, 即自由变量的查找
闭包的两个场景

实际开发中闭包的应用
//闭包实际开发中主要用于封装变量, 收敛权限

function isFirstLoad(){
     var _list = [];

     return function(num){
          if(_list.indexOf(num) >= 0){
               return false;
          }else{
               _list.push(num);
               return true;
          }
     }
}

var firstLoad = isFirstLoad();
firstLoad(10)  //true
firstLoad(10)  //false
firstLoad(20)  //true
firstLoad(20)  //false

相关文章

  • js闭包的理解

    什么是闭包 通俗的来讲,个人觉得闭包就是延长变量作用域的函数。众所周知js的作用域分为全局作用域和链式作用域。在函...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • js函数中的this

    前两篇文章“执行环境和作用域”和“js中的闭包”,我对谈了执行环境、作用域、作用域链和闭包的理解。但当牵涉到对象中...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • Javascript 闭包

    如果要了解闭包,我们需要先了解闭包的由来,闭包的产生,源于JS的词法作用域 词法作用域 作用域是指一个 变量能够访...

  • JS基础知识:变量对象、作用域链和闭包

    JS基础知识:变量对象、作用域链和闭包 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些...

  • JavaScript 函数闭包(colsure)

    理解闭包,你首先必须理解JS的变量作用域,JavaScript作用域和作用域链。 ES6之前,变量的作用域分为全局...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • js闭包详解

    1.什么是闭包? 要了解什么是闭包,首先你要了解作用域。 js的作用域分两种,全局作用域和局部作用域。 我们知道在...

网友评论

      本文标题:JS作用域和闭包

      本文链接:https://www.haomeiwen.com/subject/zrzrnxtx.html