函数对象
首先,大家得明确一个概念:函数就是对象,代表函数的对象就是函数对象。既然是对象,那它又是被谁构造出来的呢?下面我们来看一段描述:JavaScript代码中定义函数,或者调用Function创建函数时,最终都会以类似这样的形式调用Function函数:var newFun=Function(funArgs, funBody); 。由此可知函数对象是由Function这个函数对象构造出来的。
注:Function对象本身也是一个函数,因此它也一个函数对象。关于Function的深入理解,请见后续博文。
正面我们来看一段代码:
//定义方式一
function func(x) {
alert(x);
}
//定义方式二
var func = function(x) {
alert(x);
};
//实际执行
var func = new Function(“x”, “alert(x);”);
通过上面的代码可知,函数func无非是由Function对象接收两个参数后构造出来的而矣!
注:关于定义方式一与定义方式二的区别,请见后续博文
函数对象的创建过程
函数对象详细创建步骤如下:
1. 创建一个build-in object对象fn
2. 将fn的内部[[Prototype]]设为Function.prototype
3. 设置内部的[[Call]]属性,它是内部实现的一个方法,处理函数调用的逻辑。(简单的理解为调用函数体)
4. 设置内部的[[Construct]]属性,它是内部实现的一个方法,处理逻辑参考对象创建过程。(简单的理解为创建对象《理解Javascript_06_理解对象的创建过程》一文)
5. 设置fn.length为funArgs.length,如果函数没有参数,则将fn.length设置为0
6. 使用new Object()同样的逻辑创建一个Object对象fnProto
7. 将fnProto.constructor设为fn
8. 将fn.prototype设为fnProto
9. 返回fn
步骤1跟步骤6的区别为,步骤1只是创建内部用来实现Object对象的数据结构(build-in object structure),并完成内部必要的初始化工作,但它的[[Prototype]]、[[Call]]、[[Construct]]等属性应当为 null或者内部初始化值,即我们可以理解为不指向任何对象(对[[Prototype]]这样的属性而言),或者不包含任何处理(对 [[Call]]、[[Construct]]这样的方法而言)。步骤6则将按照《理解Javascript_06_理解对象的创建过程》创建一个新的对象,它的 [[Prototype]]等被设置了。
从上面的处理步骤可以了解,任何时候我们定义一个函数,它的prototype是一个Object实例,这样默认情况下我们创建自定义函数的实例对象时,它们的Prototype链将指向Object.prototype。
注:Function一个特殊的地方,是它的[[Call]]和[[Construct]]处理逻辑一样。深层次的原因将在后续博文中介绍。
下面我们写一些用例脚本来测试一下上面的理论:
function Animal(){
}
alert(Animal.length);//0
var dog = new Animal();
这个JS证明了步骤5的正确性。最后,还是来看一下函数对象的内存图,简单起见,内存图只描述了Animal的构造过程:

来自于一个整体的分析图:

图片本身已经能解释很多很多的问题了,结合前面instanceof原理,对象构造原理,原型链原理,自已去体会吧,我就不多说什么了。
其实上Function对象是一个很奇妙的对象,它与Object的关系更是扑朔迷离,我将在《理解Javascript_09_Function与Object》中解释这一切。
最后的声明:理论过于复杂,我不改保证其正确性。但经过多方的测试,还未发现理论与实际冲突的地方。

在C++中,通过std::function模板可将函数指针转换为函数对象:使用std::function将函数指针包装成函数对象。使用std::function::target成员函数将函数对象转换为函数指针。此转换在事件处理、函数回调和泛型算法等场景中很有用,提供了更大的灵活性和代码重用性。

使用STL函数对象可提高可重用性,包含以下步骤:定义函数对象接口(创建类并继承自std::unary_function或std::binary_function)重载operator()以定义函数行为在重载的operator()中实现所需的功能通过STL算法(如std::transform)使用函数对象

函数对象在STL中的作用主要包括:1.容器比较和排序(例如std::sort、std::find_if);2.算法自定义(通过自定义谓词或比较函数定制算法行为);3.容器适配器(扩展容器功能)。此外,函数对象还用于函数器库、面向对象编程和并行编程。

函数指针和函数对象都是处理函数作为数据的机制。函数指针是指向函数的指针,而函数对象是包含重载的operator()的对象。两者都可以捕获变量并创建闭包。不同之处在于,函数指针是原始类型,而函数对象是类;函数指针必须指向有效函数,否则会产生未定义行为,而函数对象可以脱离其创建的函数而存在;函数对象通常比函数指针更易用。实战场景中,可以在排序算法中使用它们指定排序规则。

C++中的STL函数对象提供了一种高效且灵活的方式来处理容器数据,包括一元函数对象(接受1个参数并返回结果)、二元函数对象(接受2个参数并返回结果)和仿函数(重载了函数调用运算符)。函数对象具有可重用性、可扩展性和性能优化等优势。实战案例中,std::transform()函数使用std::negate函数对象对容器中的每个元素取反。技巧包括使用内联函数对象、创建自定义Lambda表达式、将函数对象作为返回值以及了解函数对象的语义和限制。

C++函数指针和函数对象是处理函数的工具。函数指针存储函数地址,函数对象则允许重载操作符和维护状态。它们在排序算法、事件处理和策略模式中都有应用,可提高代码灵活性、重用性和可维护性。

C++函数指针指向函数,允许通过指针调用函数。函数对象是重载了operator()操作符的类或结构,可像函数一样被调用。它们在使用回调函数时很有用,回调函数是传递给另一个函数作为参数的函数。

C++STL中提供了多种函数对象,可用于对元素进行比较、排序和操作。常见的函数对象包括用于升序排序的less,用于降序排序的greater,用于比较相等的equal_to,以及用于绑定函数参数的bind2nd和mem_fn。实践中,可以通过使用greater函数对象对数组进行降序排序,如下所示:利用sort()函数,greater函数对象将对指定范围内的元素进行降序排序。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version
Visual web development tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Chinese version
Chinese version, very easy to use

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.
