JavaScript中的普通函数和箭头函数的区别和用法详解

 更新时间:2017年03月21日 09:47:41   作者:不带汽的可乐  
这篇文章主要介绍了JavaScript中的普通函数和箭头函数的区别和用法详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下

最近被问到了一个问题:

javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别?

我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答……

箭头函数中的 this 和调用时的上下文无关,而是取决于定义时的上下文

这并不是很正确的答案……虽然也不是完全错误

箭头函数中的 this

首先说我的回答中没有错误的部分:箭头函数中的 this 确实和调用时的上下文无关

function make () {
  return ()=>{
    console.log(this);
  }
}
const testFunc = make.call({ name:'foo' });
testFunc(); //=> { name:'foo' }
testFunc.call({ name:'bar' }); //=> { name:'foo' }

这个例子可以看到,确实箭头函数在定义之后,this 就不会发生改变了,无论用什么样的方式调用它,this 都不会改变;

但严格来说,这并不是“取决于定义时的上下文”, 因为箭头函数根本就没有绑定自己的 this,在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用罢了;
从效果上看,这和我之前的理解并没有多大偏差,但它们的本质却是截然不同,箭头函数并不是普通函数新增了 this 不受调用时上下文影响的特性,而是减少了很多特性;

箭头函数其实是更简单的函数

实际上箭头函数中并不只是 this 和普通函数有所不同,箭头函数中没有任何像 this 这样自动绑定的局部变量,包括:this,arguments,super(ES6),new.target(ES6)……

借用别人的一个例子:

function foo() {
  setTimeout( () => {
   console.log("args:", arguments);
  },100);
}
foo( 2, 4, 6, 8 );
// args: [2, 4, 6, 8]

在普通函数中,会自动绑定上的各种局部变量,箭头函数都是十分单纯的沿着作用域链向上寻找……

箭头函数就是这么个简单、纯粹的东西;

所以我个人认为箭头函数更适合函数式编程,除了它更短以外,使用箭头函数也更难被那些没有显示声明的变量影响,导致你产生意料之外的计算结果;

那么普通函数能否实现和箭头函数一样的效果呢?

如果是像当初的我一样简单的考虑固定住 this 这个易变的家伙……那倒是很简单,有些常用的方法,比如这样:

function make () {
  var self = this;
  return function () {
    console.log(self);
  }
}

或者

function make () {
  return function () {
    console.log(this);
  }.bind(this);
}

然而第二种方法只能固定 this 这一个变量而已,如前文所述,箭头函数中的 arguments 等变量也是从作用域链中寻找的,为了实现类似的效果,我们只有重新定义一个局部变量这一种方式,而 babel 也是使用这种方式对箭头函数进行处理的。

function make () {
  return ()=>{
    console.log(this);
    console.log(arguments);
  }
}
//babel it...
function make() {
  var _this = this,
    _arguments = arguments;
  return function () {
    console.log(_this);
    console.log(_arguments);
  };
}

那么……如果我想在箭头函数中使用 arguments 该怎么办?

……我觉得如果你有这个需求,可能还是用普通函数更合适一点……

但并不是说在箭头函数中无法以类似数组的形式取到所有参数,我们可以利用展开运算符来接收参数,比如这样:

const testFunc = (...args)=>{
  console.log(args) //数组形式输出参数
}

或许真的有场景需要用到这种写法,但我还是认为,箭头函数更适合那些接受固定的参数,返回一个计算结果的简单情况;

以上所述是小编给大家介绍的JavaScript中的普通函数和箭头函数的区别和用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • JS实现的5级联动Select下拉选择框实例

    JS实现的5级联动Select下拉选择框实例

    这篇文章主要介绍了JS实现的5级联动Select下拉选择框,涉及javascript数组调用及遍历的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • JavaScript创建对象的四种常用模式实例分析

    JavaScript创建对象的四种常用模式实例分析

    这篇文章主要介绍了JavaScript创建对象的四种常用模式,结合实例形式分析了javascript使用工厂模式、构造函数模式、原型模式及动态原型模式创建对象的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-01-01
  • JavaScript 变量、作用域及内存

    JavaScript 变量、作用域及内存

    这篇文章主要介绍了JavaScript 变量、作用域及内存,需要的朋友可以参考下
    2015-04-04
  • JavaScript中使用import 和require打包后实现原理分析

    JavaScript中使用import 和require打包后实现原理分析

    这篇文章主要介绍了JavaScript中使用import 和require打包后实现原理分析,需要的朋友可以参考下
    2018-03-03
  • javascript实现支付宝滑块验证码效果

    javascript实现支付宝滑块验证码效果

    这篇文章主要为大家详细介绍了javascript实现支付宝滑块验证码效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • javascript 中的console.log和弹出窗口alert

    javascript 中的console.log和弹出窗口alert

    这篇文章主要介绍了javascript 中的console.log和弹出窗口alert 的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友参考下吧
    2016-08-08
  • JavaScript获取对象键名的五种方法

    JavaScript获取对象键名的五种方法

    在 JavaScript 中,操作对象时获取键名是高频需求,不同场景下,我们需要筛选「自身/继承属性」「可枚举/不可枚举键」「字符串/Symbol 键」,本文将全面梳理 5 种核心方法的差异与适用场景,助你精准选择,需要的朋友可以参考下
    2025-04-04
  • 微信小程序多列表渲染数据开关互不影响的实现

    微信小程序多列表渲染数据开关互不影响的实现

    这篇文章主要介绍了微信小程序多列表渲染数据开关互不影响的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • JavaScript复制变量三种方法实例详解

    JavaScript复制变量三种方法实例详解

    这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • javascript入门基础之私有变量

    javascript入门基础之私有变量

    开始接触这门语言时,可能都会觉得这门语言缺少访问控制符(如public、private、protected),从而导致不能定义私有变量和私有方法。但经过进一步了解就会知道javascript同样可以有私有变量。
    2010-02-02

最新评论