我是世界第一等:函数

  1995年5月,美国程序员Brendan Eich只用了10天,完成了javascript的设计,函数是这门语言的第一等公民。一经推出,网景公司迅速统治了整个浏览器市场。

  1997年12月,中国歌手刘德华表示不服,于是写了一首用闽南语唱的歌,叫做《我是世界第一等》。可惜的是,刘德华现在还是连个Hello World都不会写。

  

  心疼华仔……

  不过还是要回到主题,为啥我们常说,函数是javascript世界的第一等呢?

  一般的编程语言,第一类对象都具备如下几个特点:

  1. 可以通过字面量创建
  2. 可被赋于变量、数组元素和其他对象的属性
  3. 可以作为参数传递给函数
  4. 可以作为函数的返回值
  5. 可以含有能被动态创建和赋值的属性

  JavaScript的函数拥有所有以上能力,能像其他对象一样使用。因此,我们说函数是第一类对象。下面是简单演示:

    function civics1(){
        //可以通过字面量创建
    }

    var foo = {"value":‘bar‘};
    civic2 = foo;//被赋于变量
    civics1 = foo.value;//被赋于对象的属性
    civics1 = [1,2,3];//被赋于数组

    function civics2(){
        console.log("Yeah");
    }
    function callback(fn){
        console.log("I am the first!");
        fn();//有时候会使用call或者apply
    }
    callback(civics2);//作为参数传递

    function closure(){
        var free = ‘‘;
        return function(){
            return free + 1;
        };//做为返回值
    }

    civics2.attr = ‘created‘;//属性可以被赋值
    console.log(civics2.attr);

  可以看到,函数除了具备对象的所有功能,它区别对象之处是能被调用。

  函数有三种:普通函数,内联函数和匿名函数。

  函数的调用方式有四种:

  1. 直接调用
  2. 作为对象的方法调用
  3. 作为对象的构造函数调用
  4. 通过 apply( ) 或 call( ) 调用

  调用 JavaScript 函数时如果形参(parameter)和实参(augment)的数目对不上,不会报错。

  • 如果是实参多于形参,多出来的部分被忽略掉。
  • 如果是形参多于实参,没被赋值的会被设为 undefined。

  所有的函数调用都会有两个隐含的形参:arguments 和 this

  • arguments: 神似数组但不是数组。它有 length 属性,得到arguments 的长度,也可以用 index,例如 arguments[0] 访问第一个元素,但就只有这些了,没有数组具有的其他方法。
  • this:函数上下文(function context),具体是啥得看怎么被调用的

  函数的第一种和第二种调用的方式 (直接调用和作为对象方法调用)其实是一样的。因为在浏览器里,第一种其实就是 window 对象的方法,如果函数是全局函数的话。

  说到第三种,这里引申一下构造函数,ECMAScript 2015(ES6)规范已经支持class(类)了,并且还支持extend(继承),class根据 constructor 方法来创建和初始化对象,MDN的例子如下:

class Square extends Polygon {
  constructor(length) {
    // Here, it calls the parent class‘ constructor with lengths
    // provided for the Polygon‘s width and height
    super(length, length);
    // Note: In derived classes, super() must be called before you
    // can use ‘this‘. Leaving this out will cause a reference error.
    this.name = ‘Square‘;
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;
  }
}

  毕竟主流浏览器还不兼容,所以再回到ES5吧:通过 new 关键字来调用构造函数,使用构造函数调用后,以下会发生:

  • 一个新的对象被创建
  • 这个对象作为 this 参数被传递给构造函数,变成这个构造函数的函数上下文
  • 没有显式返回值,这个新对象就作为这个构造函数的值被返回

  构造函数的目的是创建一个新对象,初始化,然后作为构造值返回。

  最后一种,apply( ) 和 call( ) 。当我们调用一个函数时,使用他们来显示指定任何对象作为函数的上下文。 apply( ) 和 call ( ) 的区别只是 apply( ) 的第二参数是数组,而 call( ) 是一串单独的元素。

时间: 2024-11-05 17:12:47

我是世界第一等:函数的相关文章

流畅的python 使用一等函数实现设计模式

案例分析:重构“策略”模式 经典的“策略”模式 电商领域有个功能明显可以使用“策略”模式,即根据客户的属性或订单中的商品计算折扣.假如一个网店制定了下述折扣规则. 有 1000 或以上积分的顾客,每个订单享 5% 折扣. 同一订单中,单个商品的数量达到 20 个或以上,享 10% 折扣. 订单中的不同商品达到 10 个或以上,享 7% 折扣. 简单起见,我们假定一个订单一次只能享用一个折扣. 上下文 把一些计算委托给实现不同算法的可互换组件,它提供服务.在这个电商示例中,上下文是 Order,它

python技巧 一等函数

函数在python中作为一等函数,具有以下特点: 1.可以作为参数传递给其他函数 2.作为其他函数的值返回 3.能赋值给变量或数据结构中的元素 4.在运行的时候创建 In [1]: def add(x,y):   ...:     return x+y   ...: In [2]: new_add=add In [3]: new_addOut[3]: <function __main__.add> In [4]: new_add(3,4)Out[4]: 7 In [6]: list(map(n

JavaScript世界的一等公民 - 函数

http://www.cnblogs.com/ciangcic/p/3526957.html 简介在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作为返回值,就需要通过函数指针(function pointer).代理(delegate)等特殊的方式周折一番.而在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),

JavaScript世界的一等公民—— 函数

简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作为返回值,就需要通过函数指针(function pointer).代理(delegate)等特殊的方式周折一番. 而在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值.传参.返回,这样的函数也称之为第一级函数(First-cla

Python 使用一等函数实现设计模式

案例分析:重构"策略"模式 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 如果合理利用作为一等对象的函数,某些设计模式可以简化,"策略"模式就是其中一个很好的例子. 经典的"策略"模式 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 使用"策略"设计模式处理订单折

javascript基础修炼(8)——指向FP世界的箭头函数

一. 箭头函数 箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于"ES6里添加了哪些新特性?"这种问题的时候,几乎总是会拿箭头函数来应付.箭头函数,=>,没有自己的this , arguments , super , new.target ,"书写简便,没有this"在很长一段时间内涵盖了大多数开发者对于箭头函数的全部认知(当然也包括我自己),如果只是为了简化书写,把=>按照function关键字来解析就好了

一等函数

在python中,支持面向对象,也支持面向过程编程.字典,整数等这些都是对象,那么函数呢?答案:函数也是对象,在python中,一切都是对象. 一.函数也是对象 实例 def funca(): # 创建一个函数 """返回ok""" return 'ok' print(funca.__doc__) print(funca) print(funca()) type(funca) 输出 返回ok # __doc__ 是函数对象众多属性中的一个 <

JavaScript惰性函数定义

函数是js世界的一等公民,js的动态性.易变性在函数的应用上,体现的淋漓尽致.做为参数,做为返回值等,正是函数这些特性,使得js开发变的有趣. 下面就阐述一下,js一个有趣的应用--惰性函数定义(Lazy Function Definition). 惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了. 下面我们看几个典型的例子: 1 function addEvent (typ

11.2.3 测试组合函数

在第11.1.2 节,我们讨论跟踪代码中的依赖关系时,使用的C# 方法,类似于上两个示例中的F# 函数,演示函数式编程使得更容易识别函数做什么,访问什么数据.这不仅在写代码时非常有用,而且在测试时也极其有用. 在第11.1 节,我们写过一个命令式方法,打印出由多字组成的名字,但是,它有副作用,会从作为参数传递进来的可变列表中删除元素.只要我们以后不再使用这个列表,就不会引起任何问题.对这个方法的任何单元测试以检查打印输出,都会成功. 使这个方法棘手的是,如果我们把它与其他同样正确的方法连一起使用