JavaScript函数

定义函数的3种方式
定义命名函数

定义命名函数的语法格式如下

function functionName (parameter-list)
{ 
	statemenents
}

下面代码定义了一个简单的函数,并调用函数

<script type="text/javascript>
	hello ('yeeku') ; 
	//定义函数 hello, 该函数需要一个参数
	function hello(name) 
	( 
		alert(name + ",你好") ; 
	} 
</script>
定义匿名函数

创建匿名函数的语法格式如下

function(parameter list) 
{
	statements
}

这种函数定义语法无须指定函数名 而是将参数列表紧跟 function 关键字。在函数定义语法的最后不要忘记紧跟分号(;)
当通过这种语法格式定义了函数之后,实际上就是定义了 个函数对象(即Function实例),接下来可以将这个对象赋给另一个变量。例如

<script type="text/javascript"> 
	var f = func ion(name)
	{ 
		document.writeln('匿名函数<br>');
		document.writeln('你好 '+name);
	} ; 
	f ('yeeku'); 
</script>

实际上 JavaScript 也允许将前面第一种方式定义的有名字的函数赋值给变量,如果将有名字的函数赋值给某个变量,那么原来为该函数定义的名字将会被忽略。

使用 Function 类匿名函数

JavaScript 提供了 Function 该类 可以用于定义函数, Funtion 类的构造器的参
数个数可以不受限制, Function 以接受一系列的字符串参数,其中最后一个字符串参数是函数的执行体,执行体的各语句以分号(;)隔开,而前面的各字符串参数则是函数的参数。看下面定义函数的方式

<script type= text/javascript>
	//定义匿名函数,并将函数赋给变量
	var f = new Function ('name' , 
	"document.writeln ('Function 定义的函数<br>') ;" 
	+ "document.writeln( '你好'+name);");
	//通过变量调用匿名函数
	f('yeeku'); 
</script>

上面代码使用 new Function 语法定义了一个匿名函数,并将该匿名函数赋给 变量,从而允许通过 来访问 名函 数。
调用 Function 的构 建函数虽然能明确地表示创建了一个Function 对象,但由于Function 构造器的 最后一 个字符串代表函数执行体——当函数执行体的语句很多时,Function 的最后一个参数将变得十分臃肿,因此这种方式定义函数的语法可读性也不好

递归函数

递归函数是一种特殊函数,递归函数允许在函数定义中调用函数本身
n! =n*(n-1)!
等式左边需要求n的阶乘,而等式右边则是求n -1 的阶乘 。实质都是一个函数,因此可将求阶乘的函数定义如下。

<script type="text/javascript"> 
// 定义求阶乘的函数
	var factorial = function(n)
	{
		//只有n的类型是数值,才执行函数
		if (typeof(n) == "number") 
		{ 
			//当n不等于1时,直接返回1
			if (n == l)
			{ 
				return l; 
			) 
			//当n不等于1时,通过递归返回值
			else 
			{ 
				return n * factorial(n - 1);
			}
		} 
		//当参数不是数值时,直接返回
		else 
		{ 
			alert("参数类型不对!"); 
		} 
		//调用阶乘函数
	alert(factorial(5)); 
</script>
局部变量和局部函数

在函数里使用 var 定义的变量称为局部变量,在函数外定义的变量和在函数内不使用 var 定义的变量则称为全局变量, 如果局部变量和全局变量的变量名相同,则局部变量会覆盖全局变量 局部变量只能在函数里访问 ,而全局变量可在所有的函数里访问。
与此类似的概念是局部函数,局部变量在函数里定义,而局部函数也在函数里定义

<script type="text/javascript"> 
        function outer() 
        {    //定义一个局部函数
            function inner1() {
                document.write('局部函数1');
            }
            function inner2() {
                document.write('局部函数2');
            }
            document.write('开始测试局部函数...');
            inner1();//在函数中调用第一个局部函数
            inner2();
            document write( '结束测试局部函数...');
        }
        document.write("调用 outer 之前...<br>");
        outer();
        document.write("调用 outer 之后...<br>");
</script>

在上面代码中,在 outer 函数中定义了两个局部函数:inner1、 inner2, 并在 outer 函数内调用了这两个局部函数 。因为这两个函数是在 outer 内定义的,因此可以在 outer 内访问它们.在outer 外,则无法访问它们

函数、方法、对象、变量和类

函数是 JavaScript 编程里非常重要的一个概念。当使用JavaScript 定义一个函数后,实际上可以得到如下几项。

  • 函数: 就像 Java 的方法 样,这个函数可以被调用
  • 对象: 定义一个函数时,系统也会创建一个对象,该对象是 Function 类的实例。
  • 方法: 定义一个函数时,该函数通常都会附加给某个对象,作为该对象的方法。
  • 变量: 在定义函数的同时,也会得到一个变量
  • 类: 在定义函数的同时,也得到了一个与函数同名的类。
    函数不仅可作为函数使用,函数本身也是 个对象,是 Function 实例。
    下面程序定义了 Person 函数,也就是定义了一个 Person 类, Person 函数也会作为Person 的构造器 。定义 Person 函数时希望为该函数定义一个方法。
<script type="text/javascript"> 
	//定义一个函数 该函数也是一个类
	function Person(name , age) 
	{ 
		//将参数 name 的值赋给 name 属性
		this.name= name ; 
		//将参数 age 的值赋给 age 属性
		this.age= age ; 
		//为函数分配 info 方法 使用匿名函数来定义方法
		this.info = function() 
		{ 
			document writeln("我的名字是 :" + this name + "<br>"); 
			documen writeln("我的年纪是 :" + this age + "<br>"); 
		} ;
	}
	
	//创建p对象
	var p = new Person ('mm', 18 ); 
	//执行 info 方法
	p.info(); 
</script>

运行结果:
我的名字:mm
我的年龄: 18

函数的实例属性和类属性

在 JavaScript 中定义的变量不仅有局部变量,还有实例属性和类属性两种,根据函数中声明变量的方式,函数中的变量有3种。

  • 局部变量:在函数中以 var 声明的变量
  • 实例属性: 在函数中以 this 前缀修饰的变量
  • 类属性: 在函数中以函数名前缀修饰的变量
    实例属性是属于单个对象的,因此必须通过对象来访问;类属性是属于整个类( 也就是函数)本身的,因此必须通过类(也就是函数)来访问
    同一个类(也就是函数)只占用一块内存,因此每个类属性将只占用以块内存 ;同 一个类(也就是函数)每创建一个对象,系统将会为该对象的实例属性分配一块内存看如下代码。
<script type="text/javascript">
      function Person(national,age)
      {
          this.age = age;
          Person.national = national;
          var bb = 0;
      }
      var p1 = new Person('中国',18);
      document.writeln("创建第一个Person对象<br>");
      document.writeln("p1的age属性为" + p1.age + "<br>");
      document.writeln("p1的national属性为" + p1.national + "<br>");
      document.writeln("通过Person访问静态national属性为" + Person.national + "<br>");
      document.writeln("p1的bb属性为" + p1.bb + "<br><hr>" )

      var p2 = new Person('meiguo',17);
      document.writeln("创建两个Person对象之后<br>");
      document.writeln("p1的age属性为" + p1.age + "<br>");
      document.writeln("p1的national属性为" + p1.national + "<br>");
      document.writeln("p2的age属性为" + p2.age + "<br>");
      document.writeln("p2的national属性为" + p2.national + "<br>");
      document.writeln("通过Person访问静态national属性为" + Person.national + "<br>");
</script>

Person 函数的 age 属性为实例属性,因而每个实例的 age 属性都可以完全不同,程序应通Person 对象来访问 age 属性; national 属性为类属性,该属性完全屈于 Person 因此必须通过 Person 类来访问 national 属性, Person 对象并没有national 属性,所以通过 Person 对象访问该属性将返回 undefined;而bb则是 Person 的局部变量,在 Person 函数以外无法访问该变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值