再看JS中的函数

http://www.infoq.com/presentations/ajax-design-patterns

提到了JS

two interesting description here:

Pick&Mix Object

Free Function

Function is a closure(谁记得什么是离散中的闭包),Context matters to fucntion . Ojbect is a set of data with behavior while function is a behavior with a set of data(Closure).Function的堆栈就是它的上下文,它的closure.

函数(function)是一等公民,而方法(method)只能通过引用某对象去调用,应该说是某某对象的方法。函数本身却可以传来传去。

这里容易搞混的是:方法的定义需要function关键字,本来函数的定义同样用function,只是method在function前多了个名字和冒号,也可以用等号赋函数给某对象的方法,而对象本身(放在一个变量里)也是可以就是一个函数经过new的实例,同样涉及到function关键字,函数如果有new,就是返回一个对象。如果没有new,就是把函数直接存在变量里。所以function关键字扮演了很重要的角色。

(而大写的Function对象是系统对象,是一个类型,它的prototype可以被改写和扩展。会作用于所有用到function的地方)

 

几个经典的例子:

比如扩展function为”类”(其实是返回一个变量的函数,该函数对变量定义了一系列方法,该函数被放入变量中,可以用来实例化成对象,就Class来说,它还是”函数”):
var Class=function ()
{
      var _class=function ()
      {
this.initialize.apply(this,arguments);
      };
      for(i=0;i<arguments.length;i++)
      {
superClass=arguments[i];
for(member in superClass.prototype)
{
       _class.prototype[member]=superClass.prototype[member];
};
      };
      _class.child=function ()
      {
return new Class(this);
      };
      _class.extend=function (f)
      {
for(property in f)
{
       _class.prototype[property]=f[property];
};
      };
      return _class;
};

 

而另一个例子是定义Object系统对象的extend(方法)成为一个函数:

Object.extend=function (destination,source)
{
      for(property in source)
      {
destination[property]=source[property];
      };
      return destination;
};
属性如果是函数,那么它就是方法,对象则可以直接用{}号定义(匿名对象,无需function关键字无需new)

Object.extend(
      Event, {
     observers:false,//属性property
     element:function (event)
    {
       return event.target||event.srcElement;
     },//方法Method

    …

} )

下面这个来自prototype library,也是一个方法的定义,函数的运用能做到这个地步,就确实是懂得了javascript的function 了。

再看JS中的函数 - yww325 - 程序员

Reference of Closure

http://javascript.chinahtml.com/2006/javascript-11607091807203.shtml

http://www.infoq.com/closures

 

 

发表回复