在javascript中自己创建构造函数时可以利用this来指向新创建的对象上。这样就可以避免函数中的this指向全局了,如下

 var x = 2;
  function test(){
    this.x = 1;
  }
  var o = new test();
  alert(x); //

反之,如果不使用new,只把上面那个函数当做一个普通函数来使用的话,函数内部的this就会指向全局对象,如下

 var x = 1;
  function test(){
    this.x = 0;
  }
  test();
  alert(x); //

再之,如果把这个使用了this的函数放到一个对象当中,这个this会绑定到当前对象中,如下

var x=3;

var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
this.x = this.x + x;
this.y = this.y + y;
}
}; point.moveTo(1, 1); alert(point.x);//
alert(x);//

综上看来,貌似function内部的this会找到最近的一个外层对象进行绑定,实在找不到对象就找window

然而,问题来了,如果是function内部的function使用this会怎样?如下:

var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
// 内部函数
var moveX = function(x) {
this.x = x;//this 绑定到了全局
};
// 内部函数
var moveY = function(y) {
this.y = y;//this 绑定到了全局
}; moveX(x);
moveY(y);
}
};
point.moveTo(1, 1);
point.x; //==>0
point.y; //==>0
x; //==>1
y; //==>1

这样做this不仅没有找到外层对象point,反而直接找上了全局变量,导致凭空生成了两个全局变量,好危险的情况啊!!!

解决办法是有,就是在函数内部把this保存到一个局部变量中,如下

var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
var that = this;
// 内部函数
var moveX = function(x) {
that.x = x;
};
// 内部函数
var moveY = function(y) {
that.y = y;
}
moveX(x);
moveY(y);
}
};
point.moveTo(1, 1);
point.x; //==>1
point.y; //==>1

所以说没两把刷子还真的不要随便去使用这个this,

后来接触到了es6,也就是俗称的下一代JavaScript,它给出了一个箭头函数“=>”.

看着箭头的简介和用法,貌似它就是一个function的简写嘛,反正看着特别不习惯,别扭!

比如说下面这个简单的箭头函数代码:

(a, b) => a + b

乍看,这是个表达式吧?哪里像个函数了,哪里像了?我这急性子,是谁吃饱了撑的想出这种简写的法子。。。

直到后来在介绍的最下面来了一句“箭头函数的 this 始终指向函数定义时的 this”,

也就是说,箭头函数里面的this再也不会变来变去了,即便是call和apply这两位也不能改变这个事实

var x = 1,
o = {
x : 10,
test : () => this.x
}; alert(o.x);//
o.test(); //
o.test.call(o); // 依然是1

上面的结果很显然,this的指向确实没有任何变化,

但是,问题来了,不是说好的this会始终指向定义时的this吗,对象调用函数的方式中,this不是应该始终绑定在对象o上吗,输出的不是应该始终是10才对嘛???好晕!

实际原因是,箭头函数根本没有自己的this,导致内部的this就是外层代码块的this,这也是为什么箭头函数没有构造函数,不能使用new的原因!

Js日常笔记之this的更多相关文章

  1. js日常笔记

    写在前面: 在工作中,有时候会遇到一些零零碎碎的小知识点,虽然这些网上都可以查询到,但还是想把一些自己不是很熟悉的当做笔记记录下来,方便以后查询. 1.按钮隐藏/显示/可用/不可用 $("# ...

  2. Js日常笔记之变量删除

    在Javascript是可以使用delete来手动删除变量,通过这样的方法让GC来回收内存,但在JS中并不是所有的对象都可以被删除的 JS中通过 var\function 声明因含有DontDelet ...

  3. Js日常笔记之数组

    1.Array构造函数有一个很大的问题,就是不同的参数,会导致它的行为不一致,es6好像专门为此对数组有升级 因此,不建议使用new Array生成新数组,直接使用数组字面量[...]是更好的做法. ...

  4. JS面向对象笔记二

    菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  7. .Net 转战 Android 4.4 日常笔记目录

    .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 .Net 转战 Android 4.4 ...

  8. js读书笔记

    js读书笔记 基本类型的基本函数总结 1. Boolean() 数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 "&q ...

  9. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

随机推荐

  1. 【树形dp】vijos P1180 选课

    题解: http://www.cppblog.com/rakerichard/articles/105004.html 惊了,讨论子树大小能否dp真鸡儿麻烦,按照上面那份题解,可以不用分这么多类,可以 ...

  2. 【贪心】POJ2393-Yogurt Factory

    [思路] 水题,没什么好说的.每周为之后多生产的牛奶可以看作之后才生产的.每周最少生产单价=min(上周生产的最小单价+储存单价,本周生产单价).注意ans是long long,否则会WA. #inc ...

  3. 20172333 2017-2018-2 《Java程序设计》第8周学习总结

    20172333 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容 多态性应用可以随时间变化指向不同类型的对象. 多态性应用,方法的引用与方法的定义代码的绑定在运行 ...

  4. (转) Unity3D常用代码收集总结

    //创建一个名为"Player"的游戏物体 //并给他添加刚体和立方体碰撞器. player=new GameObject("Player"); player. ...

  5. Toad 常用快捷键

    F9             执行全部sql                Ctrl_Enter     执行当前sql                Ctrl+T     补全table_name  ...

  6. 【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现

    今天在controller中写一个接口用来测试模拟多个请求同时到达 下订单的情况, 怎么能有效保证高并发下的库存和销量的一致性呢?[具体实现方法:https://www.cnblogs.com/sxd ...

  7. JAVA应用获取本机IP

    在应用开发的时候如何获取本机的IP呢? 本人在开发一个线上系统的时候有这样的需求,办法很简单啊,google一下,于是乎有了下面的代码: 方案一: Enumeration<NetworkInte ...

  8. Wishbone接口Altera JTAG UART

    某些时候,我们在使用Altera FPGA的时候,尤其是涉及SoC系统的时候,通常需要一个串口与PC交互.使用Altera的USB-Blaster免去了外接一个串口.我们可以使用下面所述的IP核通过U ...

  9. http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html

    http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html http://blog.sina.com.cn/s/blog_538 ...

  10. mysql中数据导出成excel文件语句

    代码如下 复制代码 mysql>select * from xi_table into outfile ’d:test.xls’; 导出为txt文件:  代码如下 复制代码 select * f ...