【JS--基础--函数】--基本概念

来源:互联网 发布:加工中心编程网上工作 编辑:程序博客网 时间:2024/05/22 03:28

1.定义:

**通常:function fname(arg) {...}

**直接量法: var fvar=function(arg) {...}    --无函数名

var fvar=function fname(arg) {...}  ----有函数名(应用场景:调用自身的递归函数)

**对象法:var myFunction=new Function("a","b","return a+b");             ----js里函数即对象

  直接量法为js表达式创建,而不是语句创建,所以更灵活了。尤其适用于那些只使用一次且无需命名的函数,但个人认为不指定fName创建一个无名函数,有的时候就没有任何意义。因为可以用表达式来代替,如下面的第2个例子。直接量法定义的例子如下:

f[0]=function(x) {...}  //define and store it;invoke:f[0](5)a.sort(function(x,y) {return x+y;})   //define and pass it to anothervar b=(function(x){return x*x;})(10)  //define and invoke



2.js里函数即对象

(1)函数对象和其他内部对象的关系

typeof返回“function”的对象都是函数对象。也称这样的对象为构造器(constructor)

alert(typeof(Function)));     //构造器alert(typeof(new Function()));   //构造器alert(typeof(Array));   //构造器alert(typeof(Object));  //构造器alert(typeof(new Array())); alert(typeof(new Date())); alert(typeof(new Object()));
前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器。

(2)运用

函数====参数

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

函数====数据(变量的值、对象属性的值、数组的元素.....)

function fs(x) {...}var c=fs;var d=c(4);var o=new Object();o.name=function(x) {return x*x;}o.name(16);var a=new Array(3);a[0]=function(x) {return x*x;}a[1]=20;a[2]=a[0](a[1])

函数====方法( 调用方法的对象成为关键字this值)


事实上,将函数作为参数传递,或者是将函数赋值给其他变量是所有事件机制的基础



3.函数参数

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

***arguments引用获得参数

function func(a,b){ alert(a); alert(b); for(var i=0;i<arguments.length;i++){ alert(arguments[i]); } } func(1,2,3); 
代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性

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

  详分析见 http://blog.csdn.net/beiji_nanji/article/details/7585156

***arguments对象的属性length,实参的长度(函数的属性length,表示函数定义时的形参个数)

(2)函数可选参数

格式: function fname(arg1,/* optional */ a)

(3) 可变长度参数列表

格式:

function fname(/* ... */)   或   function fname()

参数用arguments来取

function fname(/* ... */) {return arguments.length}fname(1,2,3)   //3function fname1() {return arguments.length}fname1(1,2,3)   //3

(4) 对象作为函数参数



4.函数的属性

(1)   length,表示函数定义时的形参个数(arguments对象的属性length,实参的长度)

(2)   prototype--对象原型

 **在js中模拟类:

     #支持对象的数据类型,但是没有类的正式概念。它通过构造函数,及其原型对象来模拟来近似的模拟类

     #但是它是一种真正的面向对象的语言,它采用的是原型的继承,而不是类的继承。

     (#类名首字母写,对象名用小写字母--编程惯例哦)

      **一个对象的原型就是它的构造函数的prototype属性的值,当函数被定义的时候,prototype属性自动创建和初始化,初始化的值叫“原型对象”

      **“原型对象”的用法:放置方法和不变属性(或为通用属性)

      **使用“原型对象”的好处:a.显著减少每个对象所需的内存数量,因为对象可以继承原型的很多属性 b.在对象创建后添加到原型中的属性,对象也可以继承后加的属性

      **object.hasOwnPropery('propertyname'):区分继承的属性和常规的属性

      **属性的读取:“先常规,再继承,再创建”。先查找常规的,找到就不往下找了,如果常规没找到,就去继承(原型)里找,原型里也没有,就自动创建一个。

      **更多:http://blog.csdn.net/chaojie2009/article/details/6719353

function rex(w,h){    this.width=w;    this.height=h;}rex.prototype.area=function(){return this.width*this.height;} //要显示的用this来访问属性,与java c不同(可以省略)。或用下面的形式。//rex.prototype.area=function(){ with(this){return width*height;}}var r=new rex(3,4);var a=r.area();


(3)  定义函数自己的属性

      当函数需要使用一个在调用过程中都保持不变的值时,使用Function对象的属性比定义一个全局变量更加方便,因为全局变量会使命名空间变得散乱。

var fname.count=0 //可在函数前申明function fname(){    return fname.count++;}



5.函数对象的2个方法: apply和call

详分析见http://blog.csdn.net/beiji_nanji/article/details/7585105



6.函数里的this指针

       this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。 

  和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的 

     JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。