<!DOCTYPE html>
<html>
<head>
	<title>demo2html</title>
	<meta charset="utf-8"/>
	<style type="text/css">
	
	</style>
</head>
<body>
<script type="text/javascript">
	/*创建函数和字面量函数*/
	/*
		function add(){
			alert("函数创建成功")
		};
		var testfunction=function(){
			alert("这是一个匿名函数");
		};
		add();  //调用函数
		testfunction();//调用字面量函数
	*/

	/*	
		var testobj=new Object();  //创建对象
		testobj.run=function(){    //给对象创建方法
			alert("这是对象内部的方法");
		};
		testobj.run();   //调用对象的方法
	*/

		/*创建函数对象*/
	/*
		function ball(){
		}
		ball.name1="testing";  //给函数对象创建属性
		alert(ball.name1);  //访问函数属性
		alert(typeof ball)
	*/

		/*函数的引用*/
	/*
		function myFunction(message){
			alert(message);
		}
		var ptr=myFunction;   //将函数的引用传递给变量
		ptr("Testing");  //变量调用函数
	*/

		/*将函数的引用传递给对象*/
	/*
		function sayName(name1){
			alert(name1);
		}
		var obj1=new Object();
		var obj2=new Object();
		var obj3=new Object();
		obj1.sayMyName=sayName;  //将引用传递给对象的变量,形成对象的方法
		obj2.sayMyName=sayName;
		obj3.sayMyName=sayName;
		obj1.sayMyName("张三")  //调用对象的方法
		obj2.sayMyName("李四");
		obj3.sayMyName("王五")
	*/

	/*
		function add(){
		}
		add.message="test"
		var ptr1=add;
		var ptr2=add;
		alert(ptr1.message);
		alert(ptr2.message)
		add.message="123";
		alert(ptr1.message)
		alert(ptr2.message)
	*/

	/*引用指向另一个变量*/
	/*
		function add(){
			alert("one");
		}
		var ptr=add;
		ptr=function(){  //创建了另一个叫做myFunctionPtr的函数而不是修改它
			alert("ptr")
		}
		add=function(){  //引用指向了另一个函数,修改了函数的引用
			alert("two")
		}
		add()
		ptr()
	*/

		/*创建函数对象*/
	/*
		function Ball(message){
			alert(message)
		}
		var ball0=new Ball("testing")
		ball0.name1="ball-0"
		alert(ball0.name1)

		function Ball(message){
			alert(message)
		}
		var ball0=new Object()
		ball0.constuct=Ball;  //将函数的引用指向了一个对象的构造器
		ball0.constuct("ceshiceshiceshi")  //由这个对象的构造器执行此函数
		ball0.name1="tesing"
		alert(ball0.name1)
		function Test(){

		}
		alert(Test.prototype)  //共享属性
	*/

		/*添加共享属性*/
	/*
		function Fish(naem1,color1){
			this.name1=naem1
			this.color1=color1
		}
		Fish.prototype.LivesIn="water"  //添加共享属性
		Fish.prototype.price=20
		var fish1=new Fish("mackrel","gray")
		var fish2=new Fish("goldfish","orange");
		var fish3=new Fish("salmon", "white");
		for (var i=1; i<=3; i++)
		{
		  var fish=eval("fish"+i);   // 我只是取得指向这条鱼的指针
		  alert(fish.name1+","+fish.color1+","+fish.LivesIn+","+fish.price);
		}
	*/

	/*    
		function Employee(name, salary)
		    {
		      this.name=name;               
		      this.salary=salary;
		    }
		    Employee.prototype.getSalary=function getSalaryFunction()
		    {
		      return this.salary;
		    }

		    Employee.prototype.addSalary=function addSalaryFunction(addition)
		    {
		      this.salary=this.salary+addition;
		    }
		    var boss1=new Employee("Joan", 200000);
			var boss2=new Employee("Kim", 100000);
			var boss3=new Employee("Sam", 150000);
			alert(boss1.getSalary());   // 输出 200000
			alert(boss2.getSalary());   // 输出 100000
			alert(boss3.getSalary());   // 输出 150000
	*/

	/*匿名函数*/
	/*
		(function(x,y){
				alert(x+y)
		})(2,3)//这个函数自我执行的能力
	*/

	/*执行并且调用函数*/
	/*
		var f1=function(){
				return "testing"
			}
			alert(f1())
	*/

		/*将自我执行的结果给变量*/
	/*
		var f2=function(){
				return "ok"
			}()
		alert(f2)
	*/

		// (
		// 	function(){
		// 		alert("fa")
		// 	}()
		// )
		
	/*
		function box(){
				var user='Tt'
				return function(){
					return user;
				}
		}
		alert(box()()) //调用内嵌函数
	*/

		// var b=box()
		// alert(b())

		/*通过闭包函数实行自动加*/
	/*
		function box(){
				var age=100
				return function(){  //调用的其实是这个方法,实现了数据在内存中驻留的时间
					age++
					return age;
				}
		}
		var b=box()
		alert(b())
		alert(b())
		alert(b())
	*/

		/*开始版*/
	/*
		function box(){
			var arr=[] //申明一个数组
			for (var i = 0; i <5; i++) {
				arr[i]=function(){  //通过循环只是把函数赋值给了每个元素
					return i;
				}	
			}
			return arr; //返回一个数组
		}
		var b=box() //把返回的数组赋值给b
		document.writeln("数组的长度为:"+b.length+"<br />")  //返回数组的长度
		for (var i = 0; i < b.length; i++) {
			document.writeln("匿名函数返回的值为:"+b[i]()+"<br />") //执行此函数每个元素的值是5,因为最后一个元素的值为5
		};
	*/

		 /*改进版*/
	/*
		function box1() {
			    var arr1 = [];
			    for (var i = 0; i < 5; i++) {
			        arr1[i] = (function (num) {       //自我执行,把函数自我执行的结果赋值给了每个元素
			        return num;
			        })(i);          //并且传参
			    }
			    return arr1;
		}
		var b1 = box1();  //返回时数组
		for (var i = 0; i < b1.length; i++) {
			document.writeln("改进后 输出的结果为:")
		    document.writeln(b1[i]+"<br />");        //这里返回的是数组,直接打印即可
		}
	*/

		//测试版
	/*
		var testarr=[];
			for (var i = 0; i < 5; i++) {
				testarr[i]=function(){
					return i;
				}
			};
			document.writeln("测试板的长度为:"+testarr.length+"<br >")
			for (var i = 0; i < testarr.length; i++) {
				document.writeln("测试版第"+(i+1)+"次"+testarr[i]+"<br />")
			};
			var aa=function(){
				return 3
			}
			document.writeln("测试版测试的结果"+aa)
	*/


		/*改进版3*/
	
	/*
		function box3() {
		    var arr3= [];
		    for (var i = 0; i < 5; i++) {
		        arr3[i] = (function (num) {
		            return function () {     
		                return num;       
		            }
		        })(i);//自我执行的结果赋值给每个元素,执行完了,将其执行的结果赋值给了每个元素
		    }
			return arr3;
		}
		var b3= box3();
		for (var i = 0; i < b3.length; i++) {
		    document.writeln(b3[i]()+"<br />");   
		}
	*/
	

		/*js函数教程地址://http://*/
		
		/*闭包中的this指定的对象是window*/
	/*
		var user='The Window00';
		var obj={
			user:'The Window001',
			getUserFunction:function(){
				return function(){
					return this.user;
				}
			}
		}
		document.writeln("返回this指定的对象"+obj.getUserFunction()())
	*/

		// function box(count1){
		// 	var i=12;
		// 	for (var i = 0; i < count1; i++) {
		// 		document.writeln(i);
		// 	}
		// }
		// var i=10
		// box(2)

		/*闭包执行完毕,立马清除内存数据*/
	/*
		function box(count) {
			    (function () {
			        for (var i = 0; i<count; i++){
	
			        }
			    })();
			    document.writeln(i);   //报错,无法访问
		}
		box(2);
	*/

	/*通过闭包访问隐私属性*/
	/*
		function Box() {
		    var age = 100;           //私有变量
		    function run() {          //私有函数
		        return '运行中...';
		    }
		    this.get = function () {   //对外公共的特权方法
		        return age + run();
		    };
		}
		var box = new Box();
		alert(box.get());

		function Person(value) {
		    var user = value;     //这句可以省略
		    this.getUser = function () {
		        return user;
		    };
		    this.setUser = function (value) {
		        user = value;
		    };
		}
	*/


	/*单例模式*/
	/*
		var box = function () {
		        var user = 'TT';                                      //私有变量
		        function run() {                                      //私有函数
		                   return '运行中...';  
		        }
		        return {
		                   publicGo : function () {               //对外公共接口的特权方法
		                            return user + run();
		                	}
		         		};
		}();
		alert(box.publicGo());
	*/



		/*单例模式*/

	/*
		function Desk() {
			//定义了一个函数
		}
		var box = function () {
		         var user = 'TT';                                      //私有变量
		         function run() {                                      //私有函数
		                   return '运行中...';  
		         }
		         var desk = new Desk();   //实例化自定义对象
		         desk.publicGo = function () {
		                   return user + run();   //给自定义函数定义方法
		         };
		         return desk;
		}();
		alert(box.publicGo());
	*/

</script>
</body>
</html>