一、概述:

  函数是进行模块化程序设计的基础, javascript重的的函数不同于其他语言,每个函数都作为一个对象被维护和运行。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或则讲函数作为参数传递。

二、认识javascript中的函数

  javascript可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来调用。

  在javascript解释执行时,函数都是被维护为一个对象,这就是函数对象(Function Object).

  函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象。例如:日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。这些内置对象的构造器是由JavaScripy本身所定义的,通过执行Array()这样的语句返回一个对象,javascript内部有一个套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。

  在javascript中,函数对象对应的类型是Function,正如数组对象对应的是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。

    <script>
function $myfunction($a,$b) { //传统写法
var $res = $a + $b;
document.write($res);
return $res;
}
</script>

  我们采用另外一种写法:

<script>
var $myfunction = new Function("$a","$b","var $res=$a+$b;document.write($res);return $res;")
</script> <body>
<h1>测试</h1>
<button onclick="$myfunction(5,12)">JS测试</button>
</body>

  其实结果是一样。

  

var funcName = new Function(p1,p2,......,pn.body);

  参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。

  需要注意的是,p1到pn是参数名称的列表, p1不仅代表一个参数,它也可以是一个逗号隔开的参数列表。

  javascript引入Function类型类型并提供new Function()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。

  函数本质是一个内部对象,由javascript解释器决定其运行方式,通过上述代码创建的函数,在程序重可以使用函数名进行调用。直接在函数声明后面加上括号就表示创建完成后立即进行函数调用。

三、函数对象和其他内部对象的关系

  除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串‘function’,而typeof一个数组对象或其他的对象时,它会返回字符串'object'。

  尽管函数本身也是一个对象,但它与普通的对象还是有区别的,应为它同事也是对象构造器,也就是说,可以NEW一个函数来返回一个对象。

  Function是所有函数对象的基础,而Object是所有对象(包括函数对象)的基础。在javascript中,任何一个对象都是Object的实例。因此,可以修改Object这个类型来让所有对象具有一个写通用的属性和方法,修改Object类型是通过prototype来完成的。

四、将函数对象作为参数传递

  每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数。

function func1(theFunc){
theFunc();
}
function func2(){
alert("good");
} func1(func2);

五、aguments

  当进行时函数调用时,出料指定的参数外,还创建了一个隐藏的对象arguments。arguments是一个类似数组但不是数组的对象。它具有数组一样的访问性质,可以用arguments[index]这样的语法取值,拥有数组长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表。

function funName($a,$b){
document.write($a+"<br />");
document.write($b+"<br />");
for(var $i=0;$i<arguments.length;$i++){
document.write(arguments[$i]+"<br />");
}
}
funName(2,4,6,8,10);

  arguments对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或则保证函数的封装性。

六、JavaScript中的this指针

  JavaScript可以使用this指针来获得该对象自身的引用。this指针是一个动态变量,一个方法内的this指针并不是始终指向定义该方法的对象。列如:

//创建两个空对象
var $obj1 = new Object();
var $obj2 = new Object();
//给两个对象都添加属性 att,分别等于1和2
$obj1.att = 1;
$obj2.att = 2;
//给$obj1 新增一个方法,用来显示att的值
$obj1.getAtt = function(){
document.write(this.att);
}
$obj1.getAtt(); //让$obj2的gerAtt方法等于$obj1的getAtt方法
$obj2.getAtt = $obj1.getAtt; $obj2.getAtt();

  javascript中的this指针是一个动态变化的变量,表明了当前运行该函数的对象。一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅仅属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。

  

七、函数的apply、call方法的运用

  javascript为函数对象定义了两个方法:apply和call。他们的作用都是讲函数绑定到另外一个对象上去运行。

Function.prototype.apply(thisArg.argArray);
Function.prototype.call(thisArg[,arg1[,arg2...]]);

javascript oop深入学习笔记(二)--javascript的函数的更多相关文章

  1. javascript oop深入学习笔记(一)

    一.定义和实例化一个类: 在OOP的思想中,类是一个很重要的元素,一个类表示了具有相似的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,我们也可以称之为对象. 在javascript中, ...

  2. Javascript oop深入学习笔记(三)--javascript中类的实现

    一.类的实现机制 在javascript中可以使用function关键字来定义一个类.在函数内通过this指针引用的变量或则方法都会成为类的成员. function classDemo(){ var ...

  3. Javascript高级编程学习笔记(23)—— 函数表达式(1)递归

    前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...

  4. Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量

    私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...

  5. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  6. Javascript高级编程学习笔记(24)—— 函数表达式(2)闭包

    昨天的文章中主要记录了,函数表达式与函数声明的区别 以及在JS中如何安全地使用递归 那么既然要深入地理解JS中的函数,闭包就是一个绕不开的概念 闭包 JS高编一书中对闭包的概念定义如下: 闭包是指有权 ...

  7. Javascript高级编程学习笔记(7)—— 函数

    前几天有事耽搁了,今天继续更新 今天的主要内容是JS中的函数 这一篇主要讲函数的定义等内容,至于变量提升.执行环境.闭包.内存回收等内容在后面讲,高玩们可以不用看下面的正文了. 函数 首先来讲,函数对 ...

  8. python学习笔记二:(python3 logging函数中format说明)

    背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...

  9. scala 学习笔记二 方法与函数

    1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...

随机推荐

  1. fedora 安装python mysql

    如果你服务器环境允许yum,安装MySQL-python模块就很简单了. 如果直接安装不行,先 安装MySQL-devel后正常运行 yum install mysql-devel yum insta ...

  2. HDU-4742 Pinball Game 3D 三维LIS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意:求3维的LIS.. 用分治算法搞得,参考了cxlove的题解.. 首先按照x排序,然后每个 ...

  3. Hibernate初认识以及HelloWorld

    一.Hibernate初认识 1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 2.对 ...

  4. Lua学习笔记(五):面向对象的实现

    Lua本身是没有class之类的关键字的,但是我们可以巧妙利用function也是值和table的特性来实现面向对象的特性. 通过复制表的实现 Lua中的类也是一个table对象,下面我们看看一个简单 ...

  5. servlet--页面自刷新

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  6. 【VxWorks系列】任务间同步与通信之共享内存

    在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...

  7. UVa839 Not so Mobile

      我的解法: 建树,递归判断 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  8. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...

  9. Javascript可变长度参数列表 - Arguments对象

    在一个函数体内,标识符arguments具有特殊含义. Arguments对象是一个类似数组的对象 eg: 验证函数参数的正确数目 function f(x, y, z) { if (argument ...

  10. DELPHI 多线程

    效果不正确 unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Control ...