js基础(闭包,立即执行函数)

观看渡一教学视频做的笔记,加强基础知识。

1. 闭包

当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。

function a () {
	function b () {
	}
	return b;
}
var demo = a();
demo();
var demo;
function b() {
	var abc = 100function a (){
		console.log(abc)
	}
	demo = a;
}
b();
demo(); //100
//只要把内部的函数拿到外面执行,就是闭包(里面的函数比外面的函数执行的寿命还长)

当a被定义的时候,生成一个a的GO;
当a被执行的时候,生成一个a的AO 和 a的GO;
当b被定义的时候,还是指向a的AO 和 a的GO;(a被执行后,本应该销毁a的作用域链,但是因为b在用,所以a的作用域链没被销毁)
直到b被执行后,a被销毁;

闭包的作用
1.实现公有变量:eg:函数累加器

function test() {
	var number = 100;
	function a() {
		number++
	}
	function b() {
		number--;
	}
	return [a,b];
}
var myArr = test();
myArr[0](); //101
myArr[1](); //100

2.可以做缓存(存储结构)eg:eater

function eater () {
	var food = '';
	var obj = {
		eat: function () {
			food = ''
		},
		push: function (myFood) {
			food = myFood;
		}
	}
	return obj;
}
var eater1 = eater();
eater1.push('apple');
eater1.eat();

3.可是实现封装,属性私有化 eg:Person()
4.模块化开发,防止污染全局变量

function test() {
	var arr = [];
	for (var i = 0;i < 10; i++) {
		arr[i] = function () {
			document.write(i);
		}
	}
	return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++){
	myArr[j]();
}
//结果为10个10
function test() {
	var arr = [];
	for (var i = 0;i < 10; i++) {
		(function (j){
			arr[j] = function () {
				document.write(j);
			}
		}(i))
	}
	return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++){
	myArr[j]();
}
//结果为0-9

2. 立即执行函数

针对初始化功能的函数,执行之后就被销毁(只执行一次)

function abc() {
	var a = 123,
		b = 234;
	console.log(a+b);
}()abc() //报错,执行一次后就被销毁了,所以报错
var num =function (a,b,c) {
	var d = a + b + c;
	return d;
}(1,2,3)

两种写法:
(function () {} ())或 (function (){})()
function test () {} //这叫函数声明,只有表达式才能被执行符号执行

var test = function () {
console.log(‘111’)
}(); //这样能被执行,这是函数表达式,执行后,(表达式的名字就没有用了test)

- function test() {
	console.log('111');
}() //加个负号,变成表达式了,可以立即执行,但是test就不代表一个函数了
function test (a,b,c) {
	console.log(a,b,c)
}(1,2,4) 
//这样肯定不会执行,但是也不会报错。系统理解为下面这样
function test (a,b,c) {
	console.log(a,b,c)
}
(1,2,4)
//函数为函数,括号为括号表达式

var a = (1-1,1+1);
a的结果为2 // 逗号表达式是先看前面的表达式,能算就算出结果;然后看后面的表达式,最后返回的结果是后面表达式算出的结果;

var f = (
	function f() {
		console.log('1')
	},
	function m() {
		console.log(2)
	}
)(); //结果为number,先执行()里面的,然后再执行
var x = 1;
if (function f() {}) {
	x += typeof f;
}
console.log(x) //结果为1undefined,类型为字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值