码迷,mamicode.com
首页 > 其他好文 > 详细

从作用域链谈闭包

时间:2020-06-12 14:15:54      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:报错   bsp   fine   类型   upd   对象   外部   闭包   function   

1.变量数据类型及检测

基本数据类型: 指的是简单的数据段  Boolean   null    undefined  number  string  Symbol

引用数据类型: 可能由多个值构成的对象     object对象类型    比如   function  array  date

区别

(1)可变性

基本类型: 不可变类型,无法添加属性

引用类型: 可变类型,支持添加和删除属性

 

如果判断数据类型

有四种方法  typeof   instanceof   constructor   prototype

var a = "abcdef";

var b = 12345;

var c= [1,2,3];

var d = new Date();

var e = function(){ console.log(111); };

var f = function(){ this.name="cat"; };

 

最常见的判断方法typeof

typeof a  --------------string

typeof b --------------- number

typeof c  --------------  object

typeof返回的类型都是字符串形式,

 

判断已知对象类型的方法    instanceof

c  instanceof Array  ---------  true

d  instanceof Date   ---------true

f  instanceof  Function  --------- true

注意instanceof 后面一定要是对象类型   并且大小写不能错   

 

根据对象的constructor判断

c.constructor === Array   ----------   true

d.constructor === Date -----------  true

注意constructor在类继承的时候会报错

 

通用的方法prototype

Object.prototype.toString.call(a)  -----------  [object String]

Object.prototype.toString.call(b)  ----------- [object Number]

Object.prototype.toString.call(c)  ----------- [object Array]

 

2.作用域,作用域链,闭包

变量作用域的类型:  全局变量和局部变量

全局作用域

对于最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的

var outerVar = ‘outter‘

function fn () {
    console.log(outerVar)      
}
fn() // outter

局部作用域

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,对于函数外部是无法访问的

function a(){
  var innter = ‘inner‘  
}
a ()
console.log(innter) // innter is not defined

注意

需要注意的是,函数内部声明变量的时候,一定要使用var命令  如果不使用,将会声明一个全局变量

function fn(){
   innvar = ‘dsdasda‘  
}
fn()
console.log(innvar)   //  dsdasda

 

作用域链

在js引擎中,通过标识符查找标识符的值,会从当前作用域向上查找,直到作用域找到第一个匹配的标识符的位置,就是js的作用域链

https://www.cnblogs.com/ys-wuhan/p/6979905.html

 

 

闭包

红皮书上说的    闭包是指有权访问另外一个函数作用域中变量的函数

(1).闭包可以访问当前函数以外的变量,

 

function getouter(){
    var date = ‘815‘
    function getdate(str){
          console.log(str + date)  
    }      
    return  getdate(‘今天是:‘)  // 今天是: 815
}
getouter()

getdate是一个闭包,该函数执行时,会形成一个作用域A,A中并没有定义变量date,但它能在父一级作用域中找到该变量的定义

(2).即时外部函数已经返回,闭包仍能访问外部函数定义的变量

function getOuter(){
  var date = ‘815‘;
  function getDate(str){
    console.log(str + date);  //访问外部的date
  }
  return getDate;     //外部函数返回
}
var today = getOuter();
today(‘今天是:‘);   //"今天是:815"
today(‘明天不是:‘);   //"明天不是:815"

(3).闭包可以更新外部变量的值

function updateCount(){
  var count = 0;
  function getCount(val){
    count = val;
    console.log(count);
  }
  return getCount;     //外部函数返回
}
var count = updateCount();
count(815); //815
count(816); //816

 

从作用域链谈闭包

标签:报错   bsp   fine   类型   upd   对象   外部   闭包   function   

原文地址:https://www.cnblogs.com/icelolo/p/13071616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!