关于函数表达式中的this:
自动引用正在调用当前方法的.前的对象
1、obj.fun()中的this
  fun中的this -> obj
2、new Fun()
  Fun中的this -> 正在创建的新对象
3、fun()和匿名函数自调
  this -> window
4、类型.prototype.fun() fun中的this -> 将来调用fun的.前的子对象,子对象一定是当前类型
5、如果this不是想要的对象
  fun.call(替换this的对象),相当于对象.fun()
ex:键盘事件

 //var self=this;//②将this用变量self替换
//...
document.onkeydown=function(e){
switch(e.keyCode){
case 37:this.moveRow(1); break;
case 38:this.moveCow(1); break;
case 39:this.moveRow(-1); break;
case 40:this.moveCow(-1); break;
}
}.bind(this)//①
//...

ECMAScript6中的箭头函数:(Chrome 56版本以上支持)
语法:标识符 => 表达式
ex1:var result = values.sort(function(a, b){return a - b;});
  function(a,b){return a - b;} -> (a, b) => a - b);

ex2:var sum = function(num1, num2){return num1 + num2;};
  var sum = (num1, num2) => num1 + num2;

举例说明:

 var obj = {
birth:1990,
getAge:function(){
var fun = function(){
return new Date().getFullYear() - this.birth;
};
return fun();
}
};
obj.getAge();//NaN

毫无疑问,上述代码输出结果为NaN,可通过绑定this,结果输出27;

 getAge:function(){
var fun = function(){
return new Date().getFullYear() - this.birth;
}.bind(this);
return fun();
}

同样的,可以将上下文this缓存到一个变量中,以便在本函数作用域内包含另一个函数作用域的情况下可以继续使用此上下文对象this;

 var obj = {
birth:1990,
getAge:function(){
var self = this;
var fun = function(){
return new Date().getFullYear() - self.birth;
};
return fun();
}
};
obj.getAge();//

更为简洁的方法,使用箭头函数代替;

 var obj = {
birth:1990,
getAge:function(){
var fun = () => new Date().getFullYear() - this.birth;
return fun();
}
};
obj.getAge();//

//箭头函数没有它自己的this值,箭头函数内的this值继承自外围作用域;
//可以修复this的指向,始终指向词法作用域(静态作用域):在书写代码或者说定义时确定的;

箭头函数的绑定:

 var obj = {
birth:1990,
getAge:function (year) {
var fun = (y) => y - this.birth;
return fun.call({birth:1992}, year);//call函数的第一个参数都是要传给当前对象的对象及函数内部的this;
}
};
obj.getAge(2017);//

补充:

箭头函数的确与传统函数有不同之处,但仍存在共同的特点;
1、对箭头函数进行typeof操作会返回“function”;
2、箭头函数仍是Function的实例,故而instanceof的执行方式与传统函数一致;
3、call/apply/bind方法仍适用于箭头函数,但就算调用这些方法扩充当前作用域,this也依旧不会变化;
   箭头函数与传统函数最大的不同之处在,禁用new操作;

声明:本博客的文章除特殊说明外均为原创,转载请注明出处;

ES6中的箭头函数的更多相关文章

  1. ES6中的箭头函数与普通函数的区别

    箭头函数与普通函数的区别 1.语法上更加简洁.清晰 基本语法: // 关于箭头函数的参数 // 如果箭头函数没有参数,直接写一个括号即可 let fun1 = () => { console.l ...

  2. ES6中的箭头函数和普通函数有什么区别?

    1.普通函数中的this总是指向调用它的那个对象, 箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call().bind().apply().(正是因为它没有 ...

  3. JS ES6中的箭头函数(Arrow Functions)使用

    转载这篇ES6的箭头函数方便自己查阅. ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 基础语法 (参数1, 参数2, …, 参数N) => ...

  4. es6中的(=>)箭头函数

    x => x * x 上面的箭头函数相当于: function (x) { return x * x; } 箭头函数相当于匿名函数,并且简化了函数定义. 箭头函数有两种格式,一种像上面的,只包含 ...

  5. ES6中的箭头函数的语法、指向、不定参数

    箭头函数的语法 function fn1() { console.log(1); } let fn2 = () => { console.log(2); } fn1()//1 fn2()//2 ...

  6. 聊聊 ES6 中的箭头函数

    首先来两点: 当只有一个参数的时候,那么 () 可以省略 当只有一个 return 的时候,那么 {} 可以省略 当函数体内只有一条语句的时候,那么 {} 也可以省略 下面来几个简单的例子来对比 ES ...

  7. [js高手之路] es6系列教程 - 箭头函数详解

    箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...

  8. ES6学习之箭头函数

    ES6学习笔记--箭头函数 箭头函数一直在用,最近突然想到重新看一下箭头函数的用法,所以这里做一些总结. 箭头函数长这个样子: let fn = a => a++; // fn 是函数名, a= ...

  9. es6学习笔记--箭头函数

    基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...

随机推荐

  1. 一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

    作为一个后台程序猿,经常需要把一堆程序集(DLL)或者应用程序(EXE)复制到多个服务器上,实现程序的代码逻辑更新,用以测试新的功能或改动逻辑.这里给大家介绍一个自己实现的PowerShell脚本,方 ...

  2. 关于PHP高并发抢购系统设计

    内容并发抢购系统注意事项高并发架构设计描述程序端核心代码实现订单流程mysql 端并发解决方案注意事项(1)高并发环境下,对于服务器cup.内存.网络宽带使用率会瞬间暴涨,需要注意对同服务器上其他应用 ...

  3. nodejs零基础详细教程2:模块化、fs文件操作模块、http创建服务模块

    第二章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑 ...

  4. 动态添加Redis密码认证

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池 ...

  5. File字节流

    1.    File f = new File("文件路径")      注意:相对路径:非web项目的相对都是以项目为起点.(src/a/txt(建议)      绝对路径:f: ...

  6. Linux 多个JDK的版本 脚本切换

    这里是在CentOS 系统下配置多个版本之间的切换 1.到官网下载jdk7和jdk8 地址:http://www.oracle.com/technetwork/cn/java/javase/downl ...

  7. Java基础学习之线程

    1.尽量避免直接使用 同步.Thread等原生操作线程的类,可以通过java.util.concurrent下对底层包装好的类进行操作, ReentrantLock:lock trylock  unl ...

  8. C# 调用cmd.exe的方法

    网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command)   {   Proces ...

  9. ubuntu 系统 更改屏幕亮度为最大(15级亮度)

    历经千辛万苦终于搞定屏幕亮度,现将成果分享如下. 硬件:联想K29 系统:UBUNTU 14.04 一.执行命令 sudo gedit /etc/default/grub 二.更改文本 然后找到 GR ...

  10. Ipython 自动重载

    一. 使用示例 In [1]: %load_ext autoreload In [2]: %autoreload 2 # Reload all modules (except those exclud ...