JavaScript基础学习(二)

寵の児 提交于 2020-01-31 00:31:25

题目:要求输入一串低于10位的数字,输出这串数字的中文大写(类似于银行的读法)
input:10000 output:壹万
input:1001010 output:壹佰万壹仟零壹拾

每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。
[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。
作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,这种链式链接叫做作用域链。

其实,这个[[scope]]存的是作用域链,而作用域链是由多个执行期上下文连接而成的

运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象(AO/GO)。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,他所产生的执行上下文被销毁。

function test() {
	var a=10;
	return a;
}
test(); //--->AO
test(); //--->AO

上面产生的两个AO是不一样的。

查找变量:从作用域链的顶端依次向下查找

例子:

function a() {
	function b(){
		var b=234;
	}
	var a=123;
	b();
}
var glob=100;
a();
//a defined: a.[[scope]]--->0:GO{}
//a doing: a.[[scope]]  --->0:AO{}
//                          1:GO{}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

例子:

function a() {
	function b() {
		function c() {
		}
		c();
	}
	b();
}
a();

//a defined: a.[[scope]]--->0:GO
//a doing  : a.[[scope]]--->0:aAO
//                          1:aGO
//b defined: b.[[scope]]--->0:aAO
//                          1:aGO
//b doing  : b.[[scope]]--->0:bAO
//                          1:aAO
//                          2:aGO
//c defined: c.[[scope]]--->0:cAO
//                          1:bAO
//                          2:aAO
//                          3:aGO

例子:

function a() {
	function b() {
		var bbb=234;
		document.write(aaa);
	}
	var aaa=123;
	return b;
}
var glob=100;
var demo=a();
demo();

在这里插入图片描述
如果是内部的函数被保存在了外部,那么一定生成闭包

闭包小练习:

function a() {
	var num =100;
	function b() {
		num++;
		console.log(num);
	}
	return b;
}
var num=a();
demo();
demo();

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

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

function add() {
	var count=0;
	function demo() {
		count++;
		console.log(count);
	}
	return demo;
}
var counter=add();
counter();
counter();
counter();
counter();

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

function test() {
	var num=100;
	function a() {
		num++;
		console.log(num);
	}
	function b() {
		num--;
		console.log(num);
	}
	return [a,b];
}
var myArr=test();
myArr[0]();
myArr[1]();
function eater() {
	food="";
	var obj={
		eat:function(){
			console.log("I am eating "+food);
			food="";
		},
		push:function (myFood){
			food=myFood;
		}
	}
	return obj;
}
var eater1=eater();
eater1.push('banana');
eater1.eat();

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

立即执行函数
定义:此类函数没有声明,在一次执行过后释放。适合做初始化工作。
因为正常定义的那些函数(全局函数)只有在整个程序结束之后才释放空间,但是有的函数往往只运行有一次,这样的话就很占用空间,那么有没有一种函数可以节省空间呢?———立即执行函数

立即执行函数的样式:
特点:执行完毕之后立即释放

(function (){}())
(function (a,b,c){
	console.log(a+b+c*2);
}(1,2,3))
var num=(function (a,b,c){
	var d=a+b+c;
	return d;
}(1,2,3))

只有表达式才能被执行符号()执行
被执行符号执行的表达式会自动放弃表达式的名字,所以这种情况下,就相当于立即执行函数:

var test=function() {
	console.log('a');
}();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!