javascript 函数(function)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>javascript 函数</title>
<script type="text/javascript" src="js/common.js"></script>
<script type="text/javascript">
//函数声明
println("-----函数的两种申明方式-----");
function sum(a,b){
	return a+b;
}
var add = function(a,b){
	return a+b;
}
println("------闭包------");
//返回一个函数,这个函数按照某个属性比较
function createCompareFunction(property){
	return function(obj1,obj2){
		var o1 = obj1[property];
		var o2 = obj2[property];
		if(o1 > o2){
			return 1;
		}else if(o1 < o2){
			return -1;
		}else{
			return 0;
		}
	}
}
var arr = [{name:"hello",age:21},{name:"zizhu",age:20}];
arr.sort(createCompareFunction("name"));
println(arr[0].name);
arr.sort(createCompareFunction("age"));
println(arr[0].age);
println("----js函数当中不存在块级作用域,变量在函数中都是可用的-----");
function f1(num){
	var sum = 0;
	for(var i = 0;i<num;i++){
		sum += i;
	}
	println("临时变量在函数中依然生效:i = " + i);
	return sum;
}
f1(3);
println("----模拟块级作用域----");
function f2(num){
	var sum = 0;
	(function(){
		//块级作用域
		for(var i = 1;i<=num;i++){
			sum += i;	
		}
	})();
	//println("无法访问到临时变量:i = " + i);
	return sum;
}
println("f2(3) = " + f2(3));
//私有变量
println("-----私有变量-----");
function MyObject(){
	var privateProp = 0;
	function privateMethod(){
		return true;
	}	
	//特权方法,能被外部访问的方法叫做特权方法
	this.publicMethod = function(){//只有这个方法可以访问对象的内部变量
		privateProp ++;
		return privateMethod();
	}
	
	this.showInfo = function(){
		println("privateProp = " + privateProp);
	}
}
var myObj = new MyObject();
myObj.showInfo();
println("privateMethod() = " + myObj.publicMethod());
myObj.showInfo();
println("---利用get和set方法访问私有变量的特权方法---");
function Person(){
	var name = ""
	
	this.getName = function(){
		return name;
	}
	
	this.setName = function(value){//函数里面的名称不要和私有变量重名了
		name = value; 
	}
}
var p = new Person();
p.setName("紫竹");
println("getName() = " + p.getName());
println("----静态私有变量---");
(function(){
	var privateProp = 0;
	var privateMethod = function(){
		return false;
	}
	/*
		这么定义有三个关键点:
		1.使用函数表达式:如果使用函数声明的方式,则只能是块级作用域里面的局部变量;
		2.没有用var修饰:如果用var修饰,则声明的只是局部变量,如果没有使用var修饰,那么这个变量编程了全局的了【本质:初始化未经声明的变量,总是会创建一个全局变量】
		3.定义一个函数,而不是定义一个对象:函数本身可以是构造函数,如果只是定义一个对象,则不能创建多个对象
	*/
	MyObj = function(){};
	MyObj.prototype.publicMethod = function(){
		privateProp ++;
		return privateMethod();
	}
	MyObj.prototype.showInfo = function(){
		println("privateProp = " + privateProp);
	}
})();
var obj1 = new MyObj();
obj1.showInfo();
println("obj1.publicMethod() = " + obj1.publicMethod());
obj1.showInfo();
println("------使用块级作用域真正实现面向对象,实现静态变量name-----");
(function(){
	var name = "";//这个属性就是静态的,由所有实例共享的变量
	Dog = function(value){
		name = value;		
	}
	
	Dog.prototype.setName = function(value){
		name = value;
	}
	
	Dog.prototype.getName = function(){
		return name;
	}
})();
var d1 = new Dog("ketty");
println("d1.getName() = " + d1.getName());
d1.setName("noky");
println("d1.getName() = " + d1.getName());
var d2 = new Dog("pooty");// name属性相当于静态变量
println("d1.getName() = " + d1.getName());
println("---模块模式---");
var singleton = function(){
	var privateVariable = 0;
	
	function privateMethod(){
		return true;
	}
	
	return {
		publicProp : false,
		publicMethod : function(){
			privateVariable ++;
			return privateMethod();
		}
	}
}();//立即被调用,然后立马返回一个对象
println(singleton.publicProp);
println(singleton.publicMethod());
println("-----匿名函数被立即调用------");
(function(){
	println("在块级作用域里面测试匿名函数立即调用");
})();
println("---模块模式的实例---");
//模块模式一般用在需要初始化的应用当中
function BaseComponent(){};
var application = function(){
	var store = new Array();
	store.push(new BaseComponent());
	return {//那些需要公开的方法,以及属性
		getComponentCount:function(){
			return store.length;
		},
		registerComponent:function(component){
			store.push(component);
		}
	}
}();
function BaseComponentImpl(){
	BaseComponent.apply(this);//继承自BaseComponent
}
println("application的初始组件数量:" + application.getComponentCount());
application.registerComponent(new BaseComponentImpl());
println("application的组件数量:" + application.getComponentCount());
println("---模块模式的实例应用二,字符串组合类---");
var Appender = function(){
	var arr = new Array();
	return {//返回需要公开的方法,有感觉了,哈哈
		append:function(str){
			arr.push(str);	
		},
		toString:function(){
			return arr.join("");	
		}
	}
}();
Appender.append("Hello");
Appender.append(",World!!!");
println("字符串组合类的使用:" + Appender.toString());
println("---模块模式应用三,表单验证工具类---");
Tool = function(){	
	return {
		checkEmail:function(email){
			if(email){
				var reg = /(\w+\.?)+@(\w+\.?)+\w+/;
				return reg.test(email);
			}
			return false;
		}		
	}
}();
println("测试电子邮件工具类:" + Tool.checkEmail("ziyun@125.com"));
println("------增强的模块模式------");
var singleton = function(){
	var prop = 1;
	
	function method(){
		var sum = 0;
		for(var i = 0;i<10;i++){
			sum += i;
		}
		return sum;
	}
	
	var obj = new Object();
	obj.publicProp = prop;
	obj.publicMethod = function(){
		prop ++;
		return method();
	}
	obj.showInfo = function(){
		println("prop = " + prop);
	}
	return obj;
}();
println("singleton.publicProp = " + singleton.publicProp);
singleton.showInfo();
singleton.publicMethod();
singleton.showInfo();
println("---块级增强模式二---");
var application = function(){
	var components = new Array();
	components.push(new BaseComponent());
	var app = new BaseComponent();//此时app本身就是一个Component
	app.getComponentCount = function(){
		return components.length;
	}
	app.registerComponent = function(component){
		components.push(component);
	}
	return app;	
}();
println("application的初始组件数量:" + application.getComponentCount());
application.registerComponent(new BaseComponent());
println("application的组件数量:" + application.getComponentCount());
</script>
</head>

<body>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值