-
2020-10-28 16:09:01
匿名函数
在 JS 中我们在大量使用匿名函数,Java 或者 C# 类似 Lambda 表达式也是匿名函数,匿名函数已经成为现代语言很重点的标志。为什么会出现匿名函数呢?
匿名函数自从 JS 流行以后使用有点泛滥的趋势,很多人都习惯使用匿名函数,因为写出来代码比较酷。简单与看上去好看不是一回事,简单是阅读代码没有太大干扰,同时可以把被调用的函数搬移到另外文件或者包中,甚至很容易替换,最关键对编译器友好,因为写代码往往逻辑非常复杂,现在编译器处理不了复杂的逻辑。我们追求的目标是简单,因为简单才是最好看的。你会注意到高手写出来代码都是平平淡淡的。
匿名函数的优点是用组装的方式把代码分成一段一段的,还可以直接访问外面变量,形成代码分离,有独立的上下文和作用域。另外可以形成独立代码段。
匿名函数不匿名
func main() { f := func() { println("a") } f() func(s string) { println(s) }("b") }
$ go build -gcflags "-N -l -S" 2>a.txt
匿名函数是不存在的,理论上没有匿名函数。编译的时候必须把函数编译成符号,链接的时候把这个符号转换成一个地址。匿名函数是Go语言语法上的抽象概念,从实现层面上不存在匿名函数一说。
匿名函数有两种写法,第一种把匿名函数赋值给变量,用变量调用。第二种方式直接定义匿名函数直接调用。
匿名函数命名是当前包的名字 + 当前所处函数名字 + func 随机序号 + 赋值变量名尾缀,链接器根据这个名字分配
.text<
更多相关内容 -
javascript笔记之匿名函数和闭包
2020-12-10 10:11:00本文介绍了js匿名函数和闭包的相关内容,供大家参考,具体内容如下 匿名函数 [removed] //function(){}//会报错 var fun = function(){};//将匿名函数赋值给变量 (function(){})();//匿名函数自执行 function... -
箭头函数,匿名函数,为什么用?怎么用?有什么不一样?使用场景是什么?
2021-05-28 15:25:37比如,受欢迎的airbnb eslint configuration库会强制使用JavaScript箭头函数创建匿名函数。 1. 即它允许使用箭头(=>)来定义函数。 如 var f = v =>v; 这个箭头函数就等同于: var f = function (v) { ...箭头函数的使用和一些特性
JS中的箭头函数用
=>
来标识。箭头函数有两个主要的优点:- 更简短的函数;
- 更直观的作用域和this的绑定(不绑定this)
因为这些优点,箭头函数比起其他形式的函数声明更受欢迎。比如,受欢迎的
airbnb eslint
configuration
库会强制使用JavaScript
箭头函数创建匿名函数。1. 即它允许使用箭头(=>)来定义函数。 如
var f = v =>v;
这个箭头函数就等同于:
var f = function (v) { return v; };
2. 如果不需要给这个函数传递参数,就使用圆括号来代表参数部分,如下所示:
var f = () =>8;
这个箭头函数就等同于:
var f = function () { return 8; };
3.如果传入的参数多于一个,同样也需要使用圆括号,如下:
var f = (num1,num2) => num1+num2;
等同于:
var f = function (num1,num2){ return num1+num2; };
4.我们可以看到,如果只有一条语句,就会自动添加return。但是如果有两条及以上的语句,就需要使用{},并在需要返回值的地方添加return。如:
var f = (num1,num2) => {num1++; return num1+num2;}
等同于:
var f = function(num1,num2){ num1++; return num1+num2; }
5.如果我们希望返回一个对象,则必须使用()将对象括起来,因为箭头函数认为{}是代码块,从而产生错误,如下:
var f = () => ({name:"zzw",age:21});
6.箭头函数可以简化回调函数。如:
[1,2,3].map(x => x*x);
这个函数在用普通函数写是:
[1,2,3].map(function(x){ return x*x; });
显然箭头函数做了很多简化工作。
7、 es6的箭头函数表达式是最适合用于非方法函数的,并且他们不能用作构造函数
这个需要注意,我们一般使用es6箭头函数的场景都是一般的函数定义,回调函数等等。而一般对于类中的某个方法,我们是不适用箭头函数的,并且更不会将构造函数写成箭头函数。
8、 箭头函数不是绑定this
在箭头函数出现之前,每个新定义的函数都有其自己的this值(例如,构造函数的this会指向一个新的对象;严格模式下的this为undefined; 一般的指向window; 如果函数作为对象的方法被调用,则this指向了那个调用它的对象)。这些在面向对象风格的编程中,带来了很大的困扰。
所以,箭头函数中的this会自动捕获其所在上下文中的this值,作为自己的this值,因为下面的代码将会如期运行:
function Person() { this.age = 0; setInterval(() => { // 回调里面的 `this` 变量就指向了期望的那个对象了 this.age++; }, 3000); } var p = new Person();
9、箭头函数表达式对非方法函数是最合适的,让我们看看当我们试着把他们当做方法时发生了什么?
'use strict'; var obj = { i: 10, b: () => console.log(this.i, this), c: function() { console.log( this.i, this) } } obj.b(); // undefined obj.c(); // 10, Object {...}
可以看到: 这里属性b的值就是使用箭头函数的一个方法,这里的this,并没有指向这个对象,而是 undefined,以为this不会自动绑定。
10. 构造函数不能使用函数,否则就会报错,如下:
可以看到,如果我们使用箭头函数作为构造函数,就会导致报错 ----
Bar is not a constructor
。11、 箭头函数没有原形属性
对于一般函数,都是由原型对象的,但是对于箭头函数,可以发现,是找不到原型对象(prototype)的,即undefined。
12、 使用yield关键字
yield关键字是不能在箭头函数中使用的,因此箭头函数不能用作生成器。
13、深层调用
如果你将函数定义为箭头函数,并且在他们之间来回调用,当你调试bug的时候你将被代码困惑,甚至得到如下的错误信息:
{anonymous}(){anonymous}(){anonymous}(){anonymous}(){anonymous}() //anonymous
箭头函数与普通函数的区别
箭头函数是匿名函数,ES5匿名函数的语法糖;但又增加了ES5所没有的一些优点,接下来我们一起来看一看箭头函数,最下面是匿名函数的详解
- 普通函数:
function add(a,b){return a+b};
- 箭头函数:
(a,b)=>a+b;
两者的区别主要分为以下几个方面:
1.this方面:
- 普通函数内部的this,默认指向window,严格模式下指向undefined;
- 箭头函数内部的this,与上一级作用域中的this指向同一个地方。
2.arguments方面:
- 普通函数,可以通过arguments来实现重载;
- 箭头函数中,没有arguments,代替它功能是剩余参数rest(…)。
3.原型对象方面:
- 普通函数,是有自己的原型对象的;
- 箭头函数,没有原型对象。
4.new方面:
- 普通函数,可以作为构造函数,通过new实例化出子函数;
- 箭头函数,不能作为构造函数,使用new会报错。
5.简易程度:
- 箭头函数比普通函数的使用简短更多;同时箭头函数通常是匿名函数。
为什么使用箭头函数
引入箭头函数有两个方面的作用:
- 更简短的函数
- 不绑定this
更简短的函数
var elements = ['h1', 'div', 'span', 'section']; elements.map(function(el) { return el.length; // 返回数组: [2, 3, 4, 7] }); // 从上面的普通函数可以改写为如下的箭头函数 elements.map((el) => { return el.length; // [2, 3, 4, 7] }); // 当箭头函数只有一个参数时,可以省略参数的圆括号 elements.map(el => { return el.length; // [2, 3, 4, 7] }); // 当箭头函数体只有一个`return`语句时,可以省略`return`关键字和方法体的花括号 elements.map(el => el.length); // [2, 3, 4, 7] // 在这个例子中,因为我们只需要`length`属性,所以可以使用参数结构 // 需要注意的是字符串`"length"`是我们想要获得的属性名称,而`elLength`则只是个变量名,可以替换成任意合法的变量名 elements.map(({ "length": elLength }) => elLength); // [2, 3, 4, 7]
不绑定this
在箭头函数出现之前,每个新定义的函数都有它自己的this值(在构造函数的情况下是一个新对象,在严格模式的函数调用中则为undefined,如果该函数被作为"对象方法"调用则为基础对象等)。
而箭头函数并没有它自己的执行上下,实际上,这就意味着代码中的this和arguments都是继承它的父函数。
const obj = { name: 'test object', createAnonFunction: function() { return function() { console.log(this.name); return this; } }, createArrowFunction: function() { return () => { console.log(this.name); return this; } } } const anon = obj.createAnonFunction(); anon(); // undefined anon() === window // true const arrow = obj.createArrowFunction(); arrow(); // 'test object' arrow() === obj // true
第一个匿名参数有自己的上下文(指向的并非obj对象),当被赋值给anon变量且调用时,this发生了改变,指向了window。另一个,箭头函数与创建它的函数有相同的上下文,故指向obj对象。
通过call或者apply调用
由于箭头函数没有自己的this指针,通过
call()
或者apply()
方法调用一个函数时,只能传递参数(不能绑定this),它们的第一个参数会被忽略。var adder = { base: 1, add: function(a) { var f = v => v + this.base; return f(a); }, addByCall: function(a) { var f = v => v + this.base; var b = { base: 2 }; return f.call(b, a) } } adder.add(1); // 2 adder.addByCall(1); // 2
不绑定arguments
箭头函数不绑定Arguments对象。因此,在本示例中,arguments只是引用了封闭作用域内的arguments:
function foo(n) { var f = () => arguments[0] + n; // 隐式绑定 foo 函数的arguments对象,arguments[0]是 n return f(); } foo(1); // 2
在大多数情况下,使用剩余参数是相对使用arguments对象的更好选择。
function foo(arg) { var f = (...agrs) => args[0]; return f(arg); } foo(1); // 1 function foo(arg1, arg2) { var f = (...args) => args[1]; return f(arg1, arg2); } foo(1, 2); // 2
箭头函数的实用
优化代码
比如你有一个有值的数组,你想去map遍历每一项,这时箭头函数就非常推荐:
const words = ['hello', 'WORLD', 'Whatever']; const downcasedWords = words.map(word => word.toLowerCase());
一个及其常见的例子就是返回一个对象的某个值:
const names = objects.map(object => object.name);
类似的,当用forEach来替换传统for循环的时候,实际上箭头函数会直观的保持this来自于父一级:
this.examples.forEach(example => { this.runExample(example); });
Promise和Promise链
当在编写异步编程时,箭头函数也会让代码更加直观和简洁。
这是箭头函数的理想位置,特别是如果您生成的函数是有状态的,同时想引用对象中的某些内容。this.doSomethingAsync().then((result) => { this.storeResult(result); });
对象转换
箭头函数的另一个常见而且十分有用的地方就是用于封装的对象转换。
例如在Vue.js中,有一种通用模式,就是使用mapState将Vuex存储的各个部分,直接包含到Vue组件中。
这涉及到定义一套mappers,用于从原对象到完整的转换输出,这在组件问题中实十分有必要的。这一系列简单的转换,使用箭头函数是最合适不过的。比如:export default { computed: { ...mapState([ 'results', 'users' ]) } }
使用三元运算符
var foo = a => a > 15 ? 15 : a; foo(10); // 10 foo(16); // 15
闭包
// 标准的闭包函数 function Add() { var i = 0; return function() { return (++i); } } var add = Add(); add(); // 1 add(); // 2 // 箭头函数体的闭包(i = 0是默认参数) var Add = (i = 0) => { return (() => (++i)) }; var add = Add(); add(); // 1 add(); // 2 // 因为仅有一个返回,return及括号也可以省略 var Add = (i = 0) => () => (++i);
箭头函数递归
var fact = (x) => ( x == 0 ? 1 : x*fact(x-1) ); fact(5); // 120
匿名函数
匿名函数有两种用法:
- 赋值
- 自我执行
1.声明一个匿名函数,直接赋值给某一个事件
windon.onload = function(){ alert('hello'); };
2.使用匿名函数表达式。将匿名函数,赋值给一个变量。
- 声明:var func=function(){ }
- 调用:func();
var show = function(){ alert('hello'); }; show();
注意:使用匿名函数表达式时,函数的调用语句,必须放在函数声明语句之后!!!
原因:检查装载时,会先对show变量及这个匿名函数声明,此时,还未将匿名函数赋值给show变量,如果在表达式之前调用,会报错 show is not a functionjs代码的执行顺序问题
js代码在运行时,会分为两大部分---- 检查装载 和 执行阶段。
- 检查装载阶段:会先检测代码的语法错误,进行变量、函数的声明
- 执行阶段:变量的赋值、函数的调用等,都属于执行阶段。
3.自执行函数,这里总结了8种常用的匿名函数调用方法:
//1.使用 !开头,结构清晰,不容易混乱,推荐使用; !function(){ document.write('ni hao'); }() //2.无法表明函数与之后的()的整体性,不推荐使用。 (function(){ document.write('wo hao'); })(); //3.能够将匿名函数与调用的()为一个整体,官方推荐使用; (function(){ document.write('hello'); }()); //4.放在中括号内执行 [function(){ document.write('world'); }()]; //5.使用 + 运算符 +function(){ document.write('ni hao'); }() //6.使用 - 运算符 -function(){ document.write('ni hao'); }() //7.使用波浪符 ~ ~function(){ document.write('ni hao'); }() //8.使用 void void function(){ document.write('ni hao'); }()
-
【Python 技巧】lambda 表达式(匿名函数)及其在内置函数中的应用
2020-12-23 01:05:24使用 lambda 编写的代码更加简洁紧凑,但是 lambda 函数支持的功能却是十分有限的,目前 PEP8 已经不建议使用 lambda,而是推荐使用 def 去定义一个函数,即便如此,作为 Python 程序员,认识和了解该匿名函数还是有... -
javascript 中匿名函数的两种定义方式。
2022-02-13 21:43:17javascript 中匿名函数的两种定义方式,分别是在表达式中定义函数与使用Function()构造函数来定义函数。 因为在使用这两种方式定义函数的时候毛都没有制定函数名,所以被称为匿名函数。 1.在表达式中定义函数 ...javascript 中匿名函数的两种定义方式,分别是在表达式中定义函数与使用Function()构造函数来定义函数。
因为在使用这两种方式定义函数的时候毛都没有制定函数名,所以被称为匿名函数。
1.在表达式中定义函数
var 变量名 = function(参数1,参数2,参数3……){ 函数体 }
上述定义函数的方法不需要制定函数名。这样是把定义的函数直接赋值给一个变量,后面的程序就可以通过这个变量来调用这个函数了。
var content = function(x , y){ return x+y } document.write(content(1,2))
2、使用Function()构造函数来定义函数
这种方式可以动态的创建函数,Function()构造函数的语法格式如下。
var 变量名 = new Function(参数1,参数2,参数3…… 函数体)
可以接收多个或者一个参数,当然也可以不接受任何参数,Function()构造函数的最后一个参数为函数体的内容。
重点:Function()构造函数中的所有参数与函数体都必须是字符串类型,一定要使用引号。
举例
var content = new Function("x","y","alert(x*y);"); content(1,2)
这里的content并不是一个函数名,是一个指向函数的变量。
-
python中什么是匿名函数
2020-11-21 03:59:04匿名函数用好了,会有画龙点睛的效果,没用好,就容易“画虎不成反类犬”,需要我们在平时的代码过程中,多学、多看、多琢磨。Python语言使用lambda关键字来创建匿名函数。所谓匿名,即不再使用def语句这样标准的...当我们在创建函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。这省去了我们挖空心思为函数命名的麻烦,也能少写不少代码,很多编程语言都提供这一特性。匿名函数用好了,会有画龙点睛的效果,没用好,就容易“画虎不成反类犬”,需要我们在平时的代码过程中,多学、多看、多琢磨。
Python语言使用lambda关键字来创建匿名函数。
所谓匿名,即不再使用def语句这样标准的形式定义一个函数。
lambda只是一个表达式,而不是一个代码块,函数体比def简单很多。仅仅能在lambda表达式中封装有限的逻辑。lambda 函数拥有自己的命名空间。
其形式通常是这样的:lambda 参数: 表达式。
例如:lambda x: x * x。它相当于下面的函数:def f(x):
return x * x
关键字lambda表示匿名函数,冒号前面的x表示函数参数,x*x是执行代码。
匿名函数只能有一个表达式,不用也不能写return语句,表达式的结果就是其返回值。 匿名函数没有函数名字,不必担心函数名冲突,节省字义空间。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:>>> f = lambda x: x * x
>>> f
at 0x3216fef44>
>>> f(6)
36
也可以把匿名函数作为别的函数的返回值返回。def add(string, i):
return lambda: int(string) + i
-
什么是匿名函数
2020-07-24 00:53:54什么是匿名函数:定义函数时,不指定函数名的函数 为什么要使用匿名函数:节约内存;避免产生全局变量,造成全局污染。 匿名函数两种情况: (1)绝大多数回调函数,都使用匿名函数(节约内存) 1)原因:匿名函数用... -
Python匿名函数lambda是什么?为什么要匿名?怎么用?
2020-11-22 21:27:50匿名函数即没有函数名的函数,常被用在以下场合:在程序中只使用一次,不需要定义函数名,节省内存中变量定义空间;编写 Shell 脚本时使用匿名函数可以省去定义函数的过程,让代码更加简洁;某些时候为了让代码更容.... -
Python中的匿名函数使用简介
2020-12-23 14:01:32当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数... -
匿名函数的定义就是: 没有名字的普通函数
2021-03-04 14:13:00匿名函数 匿名函数(英语:Anonymous Function)在计算机编程中是指一类无需定义标识符(函数名)的...匿名函数定义 匿名函数的定义就是: 没有名字的普通函数 func (参数列表) (返回值列表) { 函数体 } 匿名函数的调用 -
什么是匿名函数?
2021-02-12 22:17:35在前端面试中面试官基本都会问到什么是匿名函数、什么是闭包函数。本文就先来说一下什么是匿名函数。匿名函数顾名思义就是没有名字的函数,通常我们所写的函数都是这样的:1 function do(){2 //执行代码3 };45 //... -
Python3匿名函数lambda介绍与使用示例
2021-01-21 18:15:21匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在Python中,我们... -
js—函数的定义、匿名函数、自执行函数
2018-08-28 20:14:53函数定义的两种方式: 函数声明 function 函数名(形参){ // 函数体 } 函数表达式 var 函数名 = function(){ // 函数体 } 两种方式的区别: 函数声明——在函数声明前可以调用该函数。 函数表达式... -
MATLAB匿名函数
2021-04-20 08:10:43本文概述匿名函数是简单的(单行)用户定义函数, 无需创建单独的函数文件(M文件)即可进行定义。可以在命令窗口中, 脚本文件中或用户定义的函数中定义匿名函数。通过键入以下命令来生成匿名函数:其中f是函数句柄。输入... -
Python 如何定义匿名或内联函数
2020-09-16 10:50:52主要介绍了Python 如何定义匿名或内联函数,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下 -
js中匿名函数的创建与调用方法分析
2021-01-19 18:54:26本文实例分析了js中匿名函数的创建与调用方法。分享给大家供大家参考。...在什么情况下会使用到匿名函数。匿名函数主要有两种常用的场景,一是回调函数,二是直接执行函数。 回调函数,像ajax的异步操 -
Python lambda函数(匿名函数)的定义
2022-02-28 19:54:48在 python 中,函数反映了编程语言的扩展能力,有人认为函数是 Python 语言的灵魂,上节教程我们已经介绍了使用 def 关键字定义的函数,本节主要介绍 Python 函数中的匿名函数。 匿名函数即没有函数名的函数,常被用... -
python匿名函数的使用方法解析
2020-12-13 11:29:34一、lambda关键字的使用方法func=lambda x:x+1print(func(1))#2print(func(2))#3#以上lambda等同于以下函数def func(x):return(x+1)注释:可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为... -
python中的匿名函数
2021-03-17 17:31:31匿名函数函数可以像普通变量一样进行赋值函数可以作为另一个函数的参数进行传递def add(a, b):...add))匿名函数的出现将函数作为参数时,若函数只使用一次,没有必要单独定义,然后再传递定义匿名函数需要使用关键字... -
C# 匿名函数_C# 匿名函数使用整理
2021-02-06 10:41:28一、C# 匿名函数简介 匿名方法:没有名字的方法,不需要名字的方法。 匿名方法是没有名称只有主体的方法。 匿名方法和委托搭载使用。 ...匿名方法 精确点可以改叫 匿名函数...二、 C# 匿名函数使用场景 1. delegate .. -
MATLAB 匿名函数详解(超级全面)
2021-03-04 19:14:00目录1 匿名函数的生成1.1基础生成1.2 多参数匿名函数1.3 含定参匿名函数1.4 sym转匿名函数1.5 字符串转匿名函数1.6 函数工厂(匿名函数的自动...2.1 匿名函数数组2.2 匿名函数结构体2.3 functions函数使用2.4 局部命 -
详解Python匿名函数(lambda函数)
2021-01-20 06:17:31Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是: lambda [arg1[, arg2, … argN]]: ... -
Python匿名函数
2020-11-25 08:38:34格式:Lambda参数列表:表达式(Lambda x:x**2)(4)#foo = lambda x:x+1foo(1)上下式等同:#def foo(x):return x+1foo(1)使用关键字来定义匿名函数:参数列表不需要小括号冒号是分隔参数和表达式... -
初学者python笔记(匿名函数、map()函数、reduce()函数、filter()函数)
2020-12-22 11:54:39本篇是对Python中的匿名函数和map()函数、reduce()函数、filter()函数这四三大封装函数(遍历处理),以及它们的使用案例。 文末是对这几个函数用法功能的比较。 匿名函数 该函数的用法类似于C语言中的宏定义,只是这... -
python3----函数、匿名函数
2021-03-06 02:29:07本节将学习如何用Python定义函数,调用函数,以及学习匿名函数的使用1.定义函数Python中定义函数用关键字def,如下例所示,func为函数名def func():print( "hello world")2.函数参数一个函数可以有0个或多个形式参数... -
一文搞懂 Python Lambda 匿名函数定义、执行以及应用场景
2020-11-21 03:59:04在许多编程语言如:C#、Java 语法里都有 lambda 表达式,Python也不...本文我们一起来学习 lambda 表达式的定义及应用,课程中的以下术语可以互换lambda 表达式lambda 函数匿名函数标准函数由于 lambda 函数是对标准... -
在matlab中定义函数添加@(x)——匿名函数
2021-04-18 15:27:00@是匿名函数的意思函数句柄的使用方法也和函数是一样的。扩展资料匿名函数它是matlab中定义的一种函数形式,出现在matlab中,匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内... -
Python匿名函数及应用示例
2021-01-20 07:00:53本文实例讲述了Python匿名函数及应用。分享给大家供大家参考,具体如下: lambda关键词能创建?型匿名函数。这种函数得名于省略了def声明函数的标准步骤。 代码如下: #定义lambda函数 sum = lambda arg1,arg2:arg1+... -
Python中的匿名函数
2021-04-27 01:33:44写python的时候,大多数场景下,我都是if else...因为匿名函数,能够让你的代码足够简洁,01什么是匿名函数?在python中,匿名函数,顾名思义,就是没有名字的函数,它主要用在那些只使用一次的场景中。如果我们的程... -
JavaScript 编写匿名函数的几种方法
2021-01-19 17:41:24模式二:优先表达式 (Prior Expression) 由于 JavaScript 按照从内到外的顺序执行表达式,因此使用括号来强制执行已声明的函数。 代码如下: (function(){ // insert code here }()); 模式三:Void 操作符 (Void ...