function 与 => 的区别

在JS中,箭头函数并不是简单的function(){}匿名函数的简写语法糖,实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了。而匿名函数的this指向运行时实际调用该方法的对象,无法在编写函数时确定。

我们看一下下面的例子:

 1 function Test() {
 2     this.num = 100;
 3
 4     this.func = function(){
 5         console.log(this.num); // 100
 6         setTimeout(function(){
 7             console.log(this.num); // undefined
 8         }, 500);
 9     };
10 }
11
12 var obj = new Test();
13 obj.func();

这里的方法里调用了setTimeout函数,该函数500毫秒后调用我们定义的函数时,实际上是window对象调用的,所以这时匿名函数的this是指向window而不是指向obj了。

在箭头函数出现之前一般都是这么写的:

 1 function Test() {
 2     this.num = 100;
 3
 4     this.func = function(){
 5         console.log(this.num); // 100
 6         var that = this;
 7         setTimeout(function(){
 8             console.log(that.num); // 100
 9         }, 500);
10     };
11 }
12
13 var obj = new Test();
14 obj.func();

这是利用了闭包的概念。箭头函数可以看做这种方式的语法糖。

如下:

 1 function Test() {
 2     this.num = 100;
 3
 4     this.func = function(){
 5         console.log(this.num); // 100
 6         setTimeout(() => {
 7             console.log(this.num); // 100
 8         }, 500);
 9     };
10 }
11
12 var obj = new Test();
13 obj.func();

箭头函数和普通函数的区别

  • 不可以当做构造函数,也就是说,不可以使用 new 命令,否则会抛出错误。
  • this、arguments、caller等对象在函数体内都不存在。
  • 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。

总结

箭头函数除了传入的参数之外,其它的对象都没有!在箭头函数引用了this、arguments或者参数之外的变量,那它们一定不是箭头函数本身包含的,而是从父级作用域继承的。

时间: 2024-10-24 08:03:38

function 与 => 的区别的相关文章

jQuery(function(){})与(function(){})(jQuery)的区别

开发jQuery插件时总结的一些经验分享一下. 一.先看 jQuery(function(){ }); 全写为 jQuery(document).ready(function(){       }); 意义为在DOM加载完毕后执行了ready()方法. 二.再看 (function(){ })(jQuery): 其实际上是执行()(para)匿名方法,只不过是传递了jQuery对象. 三.总结 jQuery(function(){ });用于存放操作DOM对象的代码,执行其中代码时DOM对象已存

(function ( ){})( ) 与 (function ( ){}( )) 有什么区别?

js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别? 转自:http://www.jb51.net/article/75089.htm 这篇文章主要介绍了js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别,需要的朋友可以参考下 没有区别. 你需要明白 IIFE 的原理,我简单说一下: 复制代码 代码如下: function foo() {...}     // 这是定义

立即执行函数: (function(){...})() 与 (function(){...}()) 有什么区别?

没有区别. function foo() {...} // 这是定义,Declaration:定义只是让解释器知道其存在,但是不会运行. foo(); // 这是语句,Statement:解释器遇到语句是会运行它的. IIFE 并非必须,传统一点可以这么写: function foo() {...} foo(); 那么为什么要 IIFE? 传统的方法啰嗦,定义和执行分开写: 传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window) 于是,开发者们想找一个可以解决以上问题

Function.apply()与Function.call()的区别

以下内容翻译自stackoverflow 链接: http://stackoverflow.com/questions/7238962/function-apply-not-using-thisarg-parameter 在AS3中,Method(方法)不同于Function(函数),Method是类的一部分,并且是和实例绑定[就是说这个类一旦实例化了,类里定义的Method会绑定这个实例],看这个链接的第二部分关于Method,引用一部分: Methods是类定义的functions(函数),

浅谈jQuery的$(function(){})和(function($){}(jQuery))的区别

一:$(function(){}) $(function(){})是$(document).ready(function(){})的简写,或者$().ready(function(){}),会在DOM加载完成之后执行. 与onload的区别在于:ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件):而onload,指示页面包含图片等文件在内的所有元素都加载完成. 二:(function($){}(jQuery)) (function($){}(jQuery))是立即执行函数:相当于

javascript精雕细琢(一):var let const function声明的区别

目录 引言 一.var 二.let 三.const 四.function 五.总结 引言 在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是.变量是由自己决定,但变量声明方法是早已经定义好的.那么在使用变量之前,了解变量声明方法,就变得尤为重要.在ES6推出之前,最常用的声明变量方法就是var.但是由于var自身的缺陷,ES6推出了let和const替代var.虽然修正了var的缺陷,但不能改变的,是之前已经用var写了多少年的项目,这些项目是无法随着

jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解

1.(function($) {…})(jQuery); 在(function($) {…})(jQuery)在内部定义的函数和变量只能在此范围内有效. 形成是否函数函数.私有变量的概念.比如: var i=3; function init(){ alert("外层init:"+i); } (function($) { var i=2; function init(){ alert("内层init:"+i); } init(); })(jQuery); init()

function,new function,Function,new Function 之间的区别

测试一: var fud01 = function()  { var temp = 100; this.temp = 200; return temp + this.temp; } alert(typeof(fud01)); alert(fud01()); 运行结果: function 300 最普通的function使用方式,定一个JavaScript函数.在大扩号内的变量作用域中,this指代fud01的所有者. 测试二: var fud02 = new function() { var t

jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解 ----转载

1.(function($) {-})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即: (function(arg){-})(param) 这就相当于定义了一个参数为arg的匿名函数,并且将param作为参数来调用这个匿名函数 而(function($){-})(jquery)则是一样的,之所以只在形参使用$,是为了不与其