javascript高级语法(进阶篇1)

闭包部分:

// function a(){
		// 	function a(){
		// 		var bbb = 34;
		// 		console.log(aaa);
		// 	}
		// 	var aaa = 123;
		// 	return b;
		// }
		// var glob = 100;
		// var demo = a();
		// demo();
		// function test(){
		// var arr = [];//arr里面填充了十个函数,
		// for(var i = 0;i < 10;i++){
		// 	arr[i] = function (){// console.log(i);
		// 		document.write(i+" ");//此时会打印10个10,这是因为闭包的原因
		// 	}
		// }
		// 	return arr;//数组返回出来。然后外部接收
		// }
		// var myArr = test();//myArr相当于arr,让myArr每一位都执行
		// for(var j = 0;j < 10;j++){
		// 	myArr[j]();
		// }
		// for(var i = 0;i < 10;i++){
		// 	document.write(i);
		// }
		// document.write(i);


		function test(){
		var arr = [];//arr里面填充了十个函数,
		for(var i = 0;i < 10;i++){
			(function (j){
				arr[j] = function (){
					document.write(j + " ");
				}
			}(i));
		}
			return arr;//数组返回出来。然后外部接收
		}
		var myArr = test();//myArr相当于arr,让myArr每一位都执行
		for(var j = 0;j < 10;j++){
			myArr[j]();
		}
		for(var i = 0;i < 10;i++){
			document.write(i);
		}
		document.write(i);

argumen和克隆部分:

//深度克隆
		var obj = {
			name:"abc",//原始值,栈内存->abc
			age:123,
			card:['visa','master'],
			wife:{
				name:'bcd',
				son:{
					name:"aaa"
				}
			}
		}
		var obj1 = {

		}       //			// name:obj.name,
			// age:123,
			// card:[obj.card[0],obj.obj.card[1]],
			// wife:{
			// 	name:"bcd",
			// 	son:{
			// 		name:"bcd",
			// 		son:
			// 	}
			// }
		
		function deepClone(origin,target){

			var target = target || {},
				toStr = Object.prototype.toString,
				arrStr = "[object Array]";
			// 控制台:Object.prototype.toString.call([]);

			for(var prop in origin){
				if(origin.hasOwnProperty(prop)){
					if(origin[prop] !=="null" && typeof(origin[prop]) == 'object'){
						if(toStr.call(origin[prop]) == arrStr){
							target[prop] = [];
						}else{
							target[prop] = {};
						}

						deepClone(origin[prop],target[prop]);
					}else{
						target[prop] = origin[prop];
					}
				}
			}
			return target;
			// var arr = ['a','b','c'];
			// for(var prop in arr){
			// 	cconsole.log(arr[prop])
			// }

			// 数组:特殊对象//也可以for in 数组
			//遍历对象 for(var prop in obj)
			//判断是否为原始值(typeof() object ) 判断是数组还是对象( instanceof toString->推荐) 建立相应的数组或者对象(拷贝一个对象-》拷贝属性,原始值直接拷贝,不是的话,引用值(数组,对象),是数组,建立一个新的数组,然后把原来的数组和现在要被拷贝的新的数组当做一对拷贝对象)
			// 完善一:没有传target,就return target
			//完善二:

		}


		// 三目运算符
		//简便操作 ? :
		// 条件判断 ? 是:否 并且会返回值else if + return
		// var num = 1 > 0 ? 2+2:1+1;
		var num = 1 > 0 ? ("10" > "9" ? 1:0):2



		// "10" > "9" :通过逐位比阿斯卡码,也就是1先比9,那么可知返回false

		// 所以以下可以简写如下,加括号稳妥点,因为他会先执行
						// if(toStr.call(origin[prop]) == arrStr){
						// 	target[prop] = [];
						// }else{
						// 	target[prop] = {};
						// }

		target[prop] = toStr.call(origin[prop]) == arrStr? [] : {}

Dom操作:



	<div>
		<p></p>
		<span></span>
		<!-- this is comment -->
	</div><!-- 这个div有7个节点,文本节点->元素节点-》文本->元素->文本->注释-》文本 -->

 <!-- 1元素节点 3文本节点 2属性节点 注释节点 9文档节点 -->

	<!-- DOM基本操作
	window.pageXOffset/page:横向/纵向
	window.pageXOffset/document.body.scollLeft









	 -->
	 <hr style="width: 10000px;">
	 <br>
	 <br>
	<script>
	//滚动条	
	// offsetL:尺寸
	function getScrollOffset(){
		if(window.pageXOffset)
		{
			return{
				x:window.pageXOffset,
				y:window.pageYOffset
			}
		}else{
			return{
				x:document.body.sc
			}
		}
	}

Json:

	<link rel="stylesheet" href="tool.js"defer="defer"><!-- 实现异步加载,等到页面解析完毕之后实现-->
</head>
<body>
	<script>
		//执行脚本为异步顺序
		//aysnc = "aysnc":加载完,立即执行,只能加载外部脚步,就是只能加src,区别于aysnc
		// asychronous javascript and xml:ajax
		


	</script>

原型链prototype:

	<script>
		//Person.prototype.constructor是什么?constructor代表构造函数,只不过存在他的原型上(prototype)
		function Person(){

		}
		var p1 = new person();//现在p1是Person的实例了
		// p1.__proto__ == Person/prototype;//实例的原型等于构造函数的原型,如果p1要访问constructype,就是p1.__prot__
		console.log(Person.prototype.constructor);//打印出构造函数,说白了,constructor(代表构造函数)里面装的是自己

		//函数有没有__proto__属性
		//构造函数.prototype 和 实例.__proto__
		//实例 = new 构造函数
        var fn = new Function();//声明一个函数 而function Person(){}(即函数)也可以是一个实例,所以
        //函数也有__proto__属性,js当中的特殊点,函数同时具有.prototype和__proto__两种属性
	</script>

作用域:

<script>
	
function test(){

}
//函数也是一个对象,属性,方法
// test.name
// test.prototype
// test.[[scope]],scope纯真的是作用域链:不可访问的属性,隐式属性,拿不出来

// test();-->AO{} AO用完丢掉,执行器上下文在执行前会被产生
// test();-->AO{} AO用完丢掉 但与上一次的AO不一样

function a(){

	function  b(){
		var b = 2334
	}

	var a = 123;
	b();
}
var glob = 100;
a();

// a.name -- a.[[scope]](定义a时产生的scope,有GO了),之后a定义完后,a执行,产生AO执行器上下文
// ,查找顺序,从作用域顶端开始寻找,在那个函数查找变量,就向那个函数的作用域顶端从上向下查找
//a defined a.[[scope]] ->0:GO{},a刚出生的时候,存的是它出生环境的对应执行器上下文,也就是GO
//a doing   a.[[scope]] ->0:AO{}(顶端) 1:GO{}(底端)

//a执行了。b才能被定义,b出生的时候,有了a
// 的劳动成果
//b defined b.[[scope]] a的AO(1)和GO(2) 
//d doing b生成自己的AO(0),放在作用域最顶端 


// var a = 234;
// function test(){
// 	var a = 123;
// 	console.log(a);
// }
// test();//解释了先找AO,再找GO

// function a(){

// 	function  b(){
// 		var b = 2334
// 		aa = 0;
// 	}

// 	var a = 123;
// 	b();
// 	console.log(aa);
// }
// var glob = 100;
// a();//首先我们知道在b里面可以访问到a变量,那么如果我在b函数里面,让aa=0,然后我在a里面访问aa;如果输出的aa依旧是123,那么说明b产生的AO和a产生的AO不是同一个,如果变了,是同一个AO,最终会变!!!!!->0 b拿的是a的引用,遵循每个函数作用域链执行顺序


// 每一函数执行完,对应的执行器上下文销毁,a执行完之后



function a(){

	function b(){

		function c(){

		}
		c();
	}
	b();
}
a();

a  defined a.[[scope]] o:GO{}
a  doing   a.[[scope]] o:aAO
					   1:GO

b  defined b.[[scope]] o:aAO
					   1:GO{}
b  doing   b.[[scope]] o:bAO
					   1:aAO
					   2:GO			

c  defined c.[[scope]] o:bAO
					   1:aAO
					   2:GO{}
c  doing   c.[[scope]] o:cAO
					   1:bAO
					   2:aAO
					   3:GO//重要,我们知道,c执行完,c的cAo(执行器上下文)会被销毁,到从defined状态,如果在这个状况之上,我再执行一次c,就会出事类似的上个c的doing,只不过cAO变成新的newAO,剩余3个和之前是一样的



</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值