zoukankan      html  css  js  c++  java
  • js中箭头函数和普通函数this的区别

      最近在学习angularJs的时候由于里面涉及到了箭头函数,箭头函数除了声明上有点区别以外,和普通函数最主要的区别还是在this的问题上。

    Js中函数中嵌套的函数this不会 “继承”。比如说以下代码:

     1             var o = {
     2                 name:'xwt',
     3                 age:13
     4             }
     5             function outer(){
     6                 console.log(this);//输出{name:'xwt,age:13}
     7                 !function inner(){
     8                     console.log(this);//输出window
     9                 }();
    10             }
    11             outer.call(o);

      上面代码我们理想的输出是应该都是o,但是很遗憾,inner中的this已经是指向全局的window了。也可以这么理解,”this“关键字通常指当前正在执行的函数所在的对象,然而,如果函数并没有在对象上被调用,比如在内部函数中,”this“就被设置为全局对象(window)。以前我们想在inner中使用outer中的this,只能在outer中定义一个变量去保存this,一般是 var that = this;然后在inner中使用that来代替this。

      用function定义的函数的this是调用的时候去获取的,是不固定的。而箭头函数中的this是箭头函数定义的时候就定义的,并且在函数销毁之前的this都不会随之改变。箭头函数的this

    指的就是函数声明时候作用域的this。用一下代码来说明区别:

     1             name = "cm";
     2             age = 15;
     3             var o = {
     4                 name:'xwt',
     5                 age:13,
     6                 sayName:()=>console.log(this.name),
     7                 sayAge:function(){
     8                     console.log(this.age);
     9                 }
    10             };
    11             o.sayName();//输出cm
    12             o.sayAge();//输出13

      这里输出的13是没有任何问题的,但是这里为什么是输出cm而不是xwt呢?这个回答可以用上面的原理来解答。因为函数sayAge是在声明对象o的时候声明的。此时o是在全局中声明的

    一个对象,所有这里sayName绑定的this就是全局的this。那么我们可以改变sayName的this吗?答案是当然可以。我们只要创建一个函数,然后在函数中声明o,然后通过call或者apply去改变

    函数的this,那么声明出来的sayName的this就是绑定了call或者apply传进来的对象了。

     1             function aa(){
     2                 var o = {
     3                     name:'xwt',
     4                     age:13,
     5                     sayName:()=>console.log(this.name),
     6                     sayAge:function(){
     7                         console.log(this.age);
     8                     }
     9                 };
    10                 o.sayName();//输出bb
    11                 o.sayAge();//输出13
    12             }
    13             var bb = {
    14                 name:'bb',
    15                 age:111
    16             }
    17             aa.call(bb);

      如上面的代码是通过call改变声明了o对象时候的作用域中的this,所以sayName绑定的this就是aa函数中的this,也就是bb。所有sayName输出的就是'bb';

      这里差不多就解释完了箭头函数中this和普通function中this的区别了。还有如果这里有朋友不是在游览器上运行,而是用node.js来运行的话,node里面的全局指的是global,但是this

    不是指向global的,他是指向module.exports(默认也是exports指向的对象)所指向的对象的。所以exports.name = 'xwt'也可以用this.name = 'xwt'来代替。这也是题外话了···

      参考:http://note.youdao.com/noteshare?id=893741a0f08ce95e930c48265a5a728e&sub=AB0F9A256AD7431699C331F45514A925

  • 相关阅读:
    mysql数据库表名区分大小写
    Maven配置和使用
    Centos7修改网卡名称
    mongo启动报错问题处理
    zabbix分布式部署和主机自动发现
    zabbix-server、proxy、agent的分布式部署步骤
    zabbix常见错误处理方式
    git用ssh方式下载和提交代码
    CentOS7使用阿里云的yum源
    VMware三种网络模式详解
  • 原文地址:https://www.cnblogs.com/cmxwt/p/7372466.html
Copyright © 2011-2022 走看看