你了解JavaScript中的function吗?

开发 前端
Function作为Javascript的核心技术之一,清晰的理解function的机制和用法,对我们进行javascript开发非常重要.今天本人就结合自己的实践为大家介绍一些function在javascript中的一些浅显用法.

Function作为Javascript的核心技术之一,清晰的理解function的机制和用法,对我们进行javascript开发非常重要.今天本人就结合自己的实践为大家介绍一些function在javascript中的一些浅显用法.

1. Function是什么

从Javascript对function的定义, function是一个由代码集合而成的对象.

从中我们可看出,我们可以使用向C语言中的函数那样使用function,也可以对function进行面向对象编程.当然Javascript中function的强

大还不止如此.

2. 如何使用function

2.1定义

  1. function myfunc(param) {  
  2.     //code  

注意Javascript中的这两个function被认为是同一个:

在运行时到底调用哪一个function取决于加载顺序,后一个加载的function会覆盖前一个.

  1. function func1() {return 'func1'; }  
  2. function func1(name) { return name; } 

换句话说就是,function的参数都是可选参数,因此funciton的识别是不包括如参的,而函数入参处的声明是为了引用方便以及可读性.

以上的代码也等价于:

  1. function func1() {  
  2.     return arguments[0] || 'func1';  
  3. }  
  4. func();              //return 'func1'  
  5. func('function'); //return 'function' 

2.2 function当作对象

是的没错,在javascript中function就是对象,我们可以向使用一个对象那样使用function.

它可以有自己的属性和方法.有如下的一个funciton:

  1. function nameOf(name) {  
  2.     return name.toUpperCase();   

2.2.1 function作为对象进行赋值

  1. var person = person || {};  
  2. person.nameOf = nameOf;  
  3. person.nameOf('yang dong'// return "YANG DONG" 

2.2.2 定义function的属性

看看以下的代码, 你能从中的到什么信息:

  1. function nameOf() {return nameOf.blogger;}  
  2. nameOf.blogger = "YANG_DONG"

没错,function可以拥有自己的属性.

考虑这样一种场景, 假如我们要统计某个function被调用的次数.那么我们有两种方式来实现:

1.设定一个全局变量来记录,该funciton被调用的次数,每调用一次,该变量加1:

  1. var globalNameOfCounter = 0;  
  2. nameOf();  
  3. globalNameOfCounter ++; 

这样做看起来是没有问题的,在代码还是比较简单的时候,它可以工作的很好,但是随着代码越来越复杂,维护这段逻辑的成本会直线上升.

主要是因为:globalNameOfCounter污染的global命名空间,并且破坏了代码的封装性.

2.使用function的属性

看看以下代码:

  1. function nameOf() {  
  2.     nameOf.counter++;  
  3.     return nameOf.blogger;  
  4. }  
  5. nameOf.blogger = “YANG_DONG"  
  6. nameOf.counter = 0;    
  7. nameOf(); //nameOf.counter = 1  
  8. nameOf(); //nameOf.counter = 2 

显而易见,第二种方式有着很好的封装性和维护性.function的属性的应用还不止如此.请看下文.

2.3 function作为名字空间

Javascript不支持名字空间(本人不太理解如此强大的语言为什么不支持名字空间呢,这是为什么呢?),

不过我们依然可以使用其强大的funciton为我们支持名字空间.

从上节我们知道function可以定义自己的属性,我们就可以利用该特性来生成名字空间.请看以下代码:

  1. nameOf.getBloggerName = function() {  
  2.     return nameOf.blogger;  

此时在nameOf名字空间之下已经包含了:blogger,counter属性和function getBloggerName.

2.4 function作为method

在javascript中function和method其实是没有什么本质区别的,如果非的区分两者的话,我想也就是this变量不同吧.

  1. function g() {return this;}  
  2. var local = local || {};  
  3. local.method = g; //修改this指向local  
  4. local.method();   //返回local对象  
  5. g();              //返回DOMWindow对象 

2.5 function皆为closure

在Javascript中所有的function都绑定了一个scope chain,因此它是一个保存了调用上下文的函数.看看下面的实例代码:

  1. var variable = 'global';  
  2. function getVariable(){  
  3.     var variable = 'local',  
  4.     func = function() {  
  5.         return variable;  
  6.     };  
  7.     return func;  
  8. }  
  9. getVariable()();  //return local; 

当func被调用的时候,它所取的varible的值是调用上下文中的变量而并非与之同名的全局变量.

3. 总结

如果用一句话概括今天对funciton的介绍,那么我想应该是: function是可以被调用执行的代码集对象.

以上是function的一些应用场景,当然它还不止这些.

比如: function作为构造函数(也就是funciton作为类),继承等.

原文:http://www.cnblogs.com/yangdong/archive/2012/02/05/function-in-javascript-0.html

【编辑推荐】

  1. JavaScript面向对象编程
  2. JavaScript中的陷阱大集合
  3. 深入理解JavaScript之强大的原型和原型链
  4. 使用JavaScript和Canvas写一个游戏框架
  5. 20个将JavaScript推到***的网站
责任编辑:陈贻新 来源: 杨栋的博客
相关推荐

2019-11-06 09:52:01

JavaScript单线程非阻塞

2017-10-26 08:53:38

前端JavaScript函数式编程

2022-08-25 14:42:45

JavaScrip字符串

2023-11-09 08:22:38

2021-07-27 06:49:11

C#存储检索

2021-11-26 08:07:16

MySQL SQL 语句数据库

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2023-05-05 08:41:16

SQL字符函数

2024-04-15 00:02:00

Java补丁技术

2021-01-07 05:40:13

BLE模块Android

2024-01-18 09:07:04

Errors函数Golang

2019-10-31 08:36:59

线程内存操作系统

2018-12-21 11:24:55

Java时间处理编程语言

2015-09-14 15:23:44

JavaScriptfunction

2012-07-25 13:25:11

ibmdw

2022-06-26 09:55:00

接口自动化项目

2018-11-21 09:32:10

IT云计算

2020-07-09 08:01:48

JavaScriptES模块

2012-09-27 10:24:22

监控机房
点赞
收藏

51CTO技术栈公众号