Js日常笔记之this

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

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

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

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

再之,如果把这个使用了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);//1
alert(x);//3

综上看来,貌似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);//10
o.test(); // 1
o.test.call(o); // 依然是1

这个this是不会改变指向对象的

时间: 2024-10-11 21:46:03

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

Js日常笔记之数组

1.Array构造函数有一个很大的问题,就是不同的参数,会导致它的行为不一致,es6好像专门为此对数组有升级 因此,不建议使用new Array生成新数组,直接使用数组字面量[...]是更好的做法. 2.Array.isArray方法用来判断一个值是否为数组.它可以弥补typeof运算符的不足 var a = [1, 2, 3]; typeof a // "object" Array.isArray(a) // true 3.push()和pop() 结合使用,就构成了"后进

Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> <script src="https://cdn.bootcss.com/vue/2.2.

You don&#39;t know JS 读书笔记(一)

前言 这里记录着自己阅读You don't know JS系列丛书的一些心得体会,也算是自己对JavaScript知识的一个总结吧. 高能预警:文章较长且琐碎,请自备板凳瓜子- Types(类型) Variables don’t have types, but the values in them do. 这句话的意思是说:变量是没有类型的,变量里面存的值才是有类型的.比如我声明一个变量var a;,此时a是不具有任何类型信息的.如果我给a赋值一个字符串a = "Hello, World&quo

[Pro Angular.JS]学习笔记1.1:设置开发环境

可以使用yeoman.io,很方便.我已经写了一篇随笔,介绍如何使用.这里也有一篇介绍的文章:http://www.cnblogs.com/JoannaQ/p/3756281.html 代码编辑器,在Mac下用了一下WebStorm,太恶心了.另外发现书的作者使用的开发环境是Windows + VS Express 2013,为了方便学习,我也使用VS Express 2013 Update2.VS2013用起来蛮舒服的,把WebStorm比得跟驼屎一样.也许是因为我没用习惯吧. 1.安装Nod

.Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK

今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refusedFailed to fetch URL http://dl-ssl.google.com/android/reposito

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

Angular JS 学习笔记

特定领域语言 编译器:遍历DOM来查找和它相关的属性, 分为编译和链接两个阶段, 指令:当关联的HTML结构进入编译阶段时应该执行的操作,可以写在名称里,属性里,css类名里:本质上是函数 稳定的DOM:绑定了数据模型的DOM元素的实例不会在绑定的生命周期发生改变 作用域:用来检测模型的改变和为表达式提供执行上下文的 AngularJS 和其它模板系统不同,它使用的是DOM而不是字符串 指令: 由某个属性.元素名称.css类名出现而导致的行为,或者说是DOM的变化 Filter过滤器:扮演着数据

Node.js学习笔记(3) - 简单的curd

这个算是不算完结的完结吧,前段时间也是看了好久的Node相关的东西,总想着去整理一下,可是当时也没有时间: 现在看来在整理的话,就有些混乱,自己也懒了,就没在整理,只是简单的记录一下 一.demo的简单介绍 这次demo,只涉及到简单的curd操作,用到的数据库是mongo,所以要安装mongo数据库,数据库连接驱动是mongoose: 当然关于mongo的驱动有很多,比如mongous mongoskin等:(详见http://cnodejs.org/topic/4f4ca8e0940ce2e

.Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用

下拉刷新很多地方都用到了,新浪微博,微信,百度新闻 这里我们使用一个开源的库叫:PullToRefresh 开源地址:https://github.com/chenyoca/pull-to-refresh 下载地址:https://github.com/chenyoca/pull-to-refresh/archive/master.zip 解压代码之后通过ecplise导入到项目里面 导入之后可能会出现库路径引用错误 在项目右键,依次对库进行修正 运行主Activity 这时就可以看到效果了!接