<!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>
javascript 函数(function)
最新推荐文章于 2023-03-06 23:21:41 发布