js函数的作用域和闭包学习笔记

js的代码没有代码块;使用函数运行的机制进行创建闭包
函数执行的时候会形成一个新的私有的作用域(栈内存),该作用域还保护了里面的私有变量不受外界的影响,我们把函数的这种保护机制叫"闭包",又或者可以直接将作用域看做闭包,最大的闭包是window。

JavaScript中的内存也分为栈内存堆内存
栈内存中存放的是存储对象的地址,
内存中存放的是存储对象的具体内容。

对于原始类型的值而言,其地址和具体内容都存在于栈内存中;而基于引用类型的值,其地址存在栈内存,其具体内容存在堆内存中。
特点:栈内存运行效率比堆内存高,空间相对推内存来说较小,反之则是堆内存的特点。

function fn(){
var a=1;
}
fn();
fn();
console.log(a);//Uncaught ReferenceError: a is not defined;

上面的fn运行了两次,所以产生了两个堆内存;两个作用域(作用域也就是闭包)各自分别有一个a的变量;a的值都是数字1,但是两个变量是不相等的;两个a之间是没有任何关系的。

全局变量和私有变量
在全局作用域下声明的变量是全局变量;
在私有作用域中声明的变量是私有变量;函数的形参也是私有的变量。

如果获取的变量没有声明过会报错,但如果直接给没有声明(没有var过)的变量赋值,相当于给全局加了一个赋值的变量。

作用域
JavaScript中的代码执行顺序是从上到下逐条运行的,遇到function定义函数的代码块,直接跳过;遇到函数执行的代码,就找到引用的函数地址,开始跳到执行函数产生的作用域中执行代码;等函数执行完以后,再回到当前作用域执行下面的代码。
函数的作用域是函数定义时决定的,而不是函数调用时决定的。

var a=“window”;
console.log(a);//window
function father(){
  console.log(a);//undefined
  var a=“father”;
  console.log(a);//father
  function children(){
  console.log(b);//undefined
  console.log(a);//father
  var b=“flag”;
  a=“children”;
  console.log(a);//children
 }
 children();
 console.log(a);//children
}
father();
console.log(a);//window

作用域链
当作用域套作用域时,最里面的children作用域中找不到的变量会到father作用域中查找,father中找不到的变量会到father的父作用域中找,一直找到window根作用域,这就是作用域链式的查找。

所谓的冒泡就是一个域中不带var声明的变量,就会对上一级的作用域产生影响,一级一级地传染,直到找到var定义语句就停止,而不是一步直接变为全局变量。

函数运行产生的作用域
函数运行会创建一个内存地址,函数运行结束,这个内存地址就会被销毁。

var a=0;
function fn(){
var a=1;
function fm(){
console.log(a);
}
return fm;
}
var testFn1=fn();//函数这个变量就相当于fm函数;
testFn1();//相当于fm函数运行;此时输出的是1;而不是0;虽然是在window中运行的;但是在fn中定义的;所以a找到的是fm上一级作用域fm的a;而不是window中的a。

当函数内return一个引用数据类型;并且函数外面有一个变量接收这个引用数据类型;此时的作用域是不销毁的

function fn() {
var i = 10;
return function (n) {
console.log(n + (++i));
}
}
var f = fn();
f(10);//->21
f(20);//->32 f占用了fn()作用域中的部分内存,所以fn()的作用域不会被销毁
fn()(10);//->21
fn()(20);//->31 直接运行函数,运行结束后作用域就被销毁了

参考整理自:https://github.com/anbang/javascript-notes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值