龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

JavaScript入门之基本函数(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
函数上下文 在Java或者C/C++等语言中,方法(函数)只能依附于对象而存在,不是独立的。而在JavaScript中,函数也是一种对象,并非其他任何对象的一部分,

函数上下文

在Java或者C/C++等语言中,方法(函数)只能依附于对象而存在,不是独立的。而在JavaScript中,函数也是一种对象,并非其他任何对象的一部分,理解这一点尤为重要,特别是对理解函数式的JavaScript非常有用,在函数式编程语言中,函数被认为是一等的。

函数的上下文是可以变化的,因此,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,总之,函数本身是独立的。可以通过Function对象上的call或者apply函数来修改函数的上下文:

call和apply

call和apply通常用来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数,我们不妨来看看JavaScript入门之对象与JSON中的例子:

  1. //定义一个人,名字为jack  
  2. var jack = {  
  3.     name : "jack",  
  4.     age : 26  
  5. }  
  6.    
  7. //定义另一个人,名字为abruzzi  
  8. var abruzzi = {  
  9.     name : "abruzzi",  
  10.     age : 26  
  11. }  
  12.    
  13. //定义一个全局的函数对象  
  14. function printName(){  
  15.     return this.name;  
  16. }  
  17.    
  18. //设置printName的上下文为jack, 此时的this为jack  
  19. print(printName.call(jack));  
  20. //设置printName的上下文为abruzzi,此时的this为abruzzi  
  21. print(printName.call(abruzzi));  
  22.    
  23. print(printName.apply(jack));  
  24. print(printName.apply(abruzzi)); 

只有一个参数的时候call和apply的使用方式是一样的,如果有多个参数:

  1. setName.apply(jack, ["Jack Sept."]);  
  2. print(printName.apply(jack));  
  3.    
  4. setName.call(abruzzi, "John Abruzzi");  
  5. print(printName.call(abruzzi)); 

得到的结果为:

  1. Jack Sept.  
  2. John Abruzzi 

apply的第二个参数为一个函数需要的参数组成的一个数组,而call则需要跟若干个参数,参数之间以逗号(,)隔开即可。

使用函数

前面已经提到,在JavaScript中,函数可以

◆ 被赋值给一个变量

◆ 被赋值为对象的属性

◆ 作为参数被传入别的函数

◆ 作为函数的结果被返回

我们就分别来看看这些场景:

赋值给一个变量:

  1. //声明一个函数,接受两个参数,返回其和  
  2. function add(x, y){  
  3.     return x + y;  
  4. }  
  5.    
  6. var a = 0;  
  7. a = add;//将函数赋值给一个变量  
  8. var b = a(2, 3);//调用这个新的函数a  
  9. print(b); 

这段代码会打印”5”,因为赋值之后,变量a引用函数add,也就是说,a的值是一个函数对象(一个可执行代码块),因此可以使用a(2, 3)这样的语句来进行求和操作。

赋值为对象的属性:

  1. <strong>var obj = {  
  2.     id : "obj1" 
  3. }  
  4.    
  5. obj.func = add;//赋值为obj对象的属性  
  6. obj.func(2, 3);//返回5</strong> 

事实上,这个例子与上个例子的本质上是一样的,第一个例子中的a变量,事实上是全局对象(如果在客户端环境中,表示为window对象)的一个属性。而第二个例子则为obj对象,由于我们很少直接的引用全局对象,就分开来描述。

作为参数传递:

  1. //高级打印函数的第二个版本  
  2. function adPrint2(str, handler){  
  3.     print(handler(str));  
  4. }  
  5.    
  6. //将字符串转换为大写形式,并返回  
  7. function up(str){  
  8.     return str.toUpperCase();  
  9. }  
  10.    
  11. //将字符串转换为小写形式,并返回  
  12. function low(str){  
  13.     return str.toLowerCase();  
  14. }  
  15.    
  16. adPrint2("Hello, world", up);  
  17. adPrint2("Hello, world", low); 

运行此片段,可以得到这样的结果:

HELLO, WORLD
hello, world

应该注意到,函数adPrint2的第二个参数,事实上是一个函数,将这个处理函数作为参数传入,在adPrint2的内部,仍然可以调用这个函数,这个特点在很多地方都是有用的,特别是,当我们想要处理一些对象,但是又不确定以何种形式来处理,则完全可以将“处理方式”作为一个抽象的粒度来进行包装(即函数)。

作为函数的返回值:

先来看一个最简单的例子:

  1. <strong>function currying(){  
  2.     return function(){  
  3.        print("curring");  
  4.     }  
  5. }</strong> 

函数currying返回一个匿名函数,这个匿名函数会打印”curring”,简单的调用currying()会得到下面的结果:

  1. <strong>function (){  
  2.     print("curring");  
  3. }</strong> 

如果要调用currying返回的这个匿名函数,需要这样:

  1. currying()(); 

第一个括号操作,表示调用currying本身,此时返回值为函数,第二个括号操作符调用这个返回值,则会得到这样的结果:

currying

原文:http://abruzzi.iteye.com/blog/646798

【系列文章】

JavaScript入门之对象与JSON

JavaScript概述

JavaScript内核之基本概念

精彩图集

赞助商链接