function 与 => 的区别
在JS中,箭头函数并不是简单的function(){}匿名函数的简写语法糖,实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了。而匿名函数的this指向运行时实际调用该方法的对象,无法在编写函数时确定。
我们看一下下面的例子:
function Test() {
this.num = 100;
this.func = function(){
console.log(this.num); //
setTimeout(function(){
console.log(this.num); // undefined
}, 500);
};
}
var obj = new Test();
obj.func();
这里的方法里调用了setTimeout函数,该函数500毫秒后调用我们定义的函数时,实际上是window对象调用的,所以这时匿名函数的this是指向window而不是指向obj了。
在箭头函数出现之前一般都是这么写的:
function Test() {
this.num = 100;
this.func = function(){
console.log(this.num); //
var that = this;
setTimeout(function(){
console.log(that.num); //
}, 500);
};
}
var obj = new Test();
obj.func();
这是利用了闭包的概念。箭头函数可以看做这种方式的语法糖。
如下:
function Test() {
this.num = 100;
this.func = function(){
console.log(this.num); //
setTimeout(() => {
console.log(this.num); //
}, 500);
};
}
var obj = new Test();
obj.func();
箭头函数和普通函数的区别
- 不可以当做构造函数,也就是说,不可以使用 new 命令,否则会抛出错误。
- this、arguments、caller等对象在函数体内都不存在。
- 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。
总结
箭头函数除了传入的参数之外,其它的对象都没有!在箭头函数引用了this、arguments或者参数之外的变量,那它们一定不是箭头函数本身包含的,而是从父级作用域继承的。
function 与 => 的区别的更多相关文章
- (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别? 转自:http://www.jb51.net/article/75089.htm ...
- 立即执行函数: (function(){...})() 与 (function(){...}()) 有什么区别?
没有区别. function foo() {...} // 这是定义,Declaration:定义只是让解释器知道其存在,但是不会运行. foo(); // 这是语句,Statement:解释器遇到语 ...
- jQuery中$(function(){})与(function($){})(jQuery)的区别
首先,这两个函数都是在页面载入后执行的函数,其中两者的区别在于: 在jQuery中$(function(){})等同于jQuery(function(){}),另一个写法为jQuery(documen ...
- function foo(){}、(function(){})、(function(){}())等函数区别分析
前面一段时间,看到(function(){}),(function(){}())这些函数就犯晕,不知道它到底是什么意思,为什么函数外要加小括号,函数后要加小括号,加和不加到底有什么区别……一直犯迷糊, ...
- javascript精雕细琢(一):var let const function声明的区别
目录 引言 一.var 二.let 三.const 四.function 五.总结 引言 在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是. ...
- jQuery 中 jQuery(function(){})与(function(){})(jQuery) 的区别
$(document).ready(function(){ // 在这里写你的代码... }); 在DOM加载完成时运行的代码 可以简写成 jQuery(function(){ // 在这里写你的代码 ...
- var a=function()跟function a()的区别
//代码一: a(); //执行这个会报错 var a = function(index){ alert(index); } a(); //执行这个不会报错 //代码二: a(); //执行这个不会报 ...
- function,new function,Function,new Function 之间的区别
测试一: var fud01 = function() { var temp = 100; this.temp = 200; return temp + this.temp; } alert(typ ...
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
1.(function($) {…})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){…} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...
随机推荐
- 【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答
TCP三次握手和四次挥手的全过程 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ...
- python套接字编程基础
python套接字编程 目录 socket是什么 套接字的工作流程 基于tcp的套接字 基于udp的套接字 socket是什么 客户端/服务器架构(C/S架构) 服务端:提供服务的一端 客户端:请求服 ...
- 启动oracle command
@echo off net start OracleXETNSListener >nul net start OracleServiceXE >nul
- Android二维码学习
http://www.cnblogs.com/liuan/category/347622.html http://blog.csdn.net/xiaanming/article/details/101 ...
- 生产环境中tomcat的配置
生产环境中要以daemon方式运行tomcat 通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/sh ...
- Hbuilder ios证书申请
最近负责app开发上线,一些心的总结 1.需要先用 苹果操作系统的证书管理 生成 .csr (多次使用) 2.进入开发者帐号 - 证书与配置c&p + App store and AD ...
- [Android Pro] so 动态加载—解决sdk过大问题
原文地址: https://blog.csdn.net/Rong_L/article/details/75212472 前言 相信Android 开发中大家或多或少都会集成一些第三方sdk, 而其中难 ...
- Asp.Net Core中Json序列化处理整理
一.Asp.Net Core中的Json序列化处理使用的是Newtonsoft.Json,更多参考:C# Newtonsoft.Json JsonSerializerSettings配置序列化操作,C ...
- Netty重要概念介绍
Netty重要概念介绍 Bootstrap Netty应用程序通过设置bootstrap(引导)类开始,该类提供了一个用于网络成配置的容器. 一种是用于客户端的Bootstrap 一种是用于服务端的S ...
- 【FFmpeg】ffplay播放rtsp视频流花屏问题 (转)
问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...