JavaScript中this关键字的使用比较

this关键字在JavaScript中,用的不能说比较多,而是非常多。那么熟悉this关键字的各种用法则显得非常关键。

this有时候就是我们经常说的上下文,这个东西的指代对象。它灵活多变,有时候你看它是对象,有时候是window宿主对象。

1.this指向宿主对象

function myWindow() {
this.id = 1; // 等价于window.id = 1
console.log(this); // 这里的this就是window了
console.log(this.id); // 1
}
myWindow();

这种情况比较普遍,也就是指向宿主对象的情况,在客户端是 window对象 在node里是 Global对象 第一个说,下面看第二种。

2.this指向调用函数的对象的时候

function myObj() {
console.log(this.x); // 在这个例子里面是obj对象
}
var obj = {};
obj.x = "xx";
obj.myObj = myObj;
obj.myObj(); // xx

这里的myObj()函数里面的 this 指向的就是obj这个外部传递来的对象了。注意看 obj.myObj() 这里前面的 obj. 这里,因为myObj是obj这个对象的方法,下面obj作为对象调用了myObj这个函数,所以这里的this就是指向调用函数的对象了。

3.this指向构造函数生成的新对象的时候

// 作为构造函数的函数记得首字母要大写
function People(gender) {
this.gender = gender;
this.sayGender = function() {
console.log(this.gender);
}
} // 输出man,函数this是新的People{}对象
var girl = new People("women"); // 输出women,函数this是指向girl{gender:"women"}对象
girl.sayGender();

这里的执行过程理一下,首先 new People("man") 这句做了几件事情:

  1. 根据构造函数创建一个空的对象People{}
  2. 然后传递到People里面(这里才叫开始构造的过程,添砖加瓦的意思)
  3. 然后这里开始的函数里面的this就是指向传进来新的People{}对象了

这里就是构造函数生成对象的一个简单的过程了,可以自己模拟着执行以下。

4.this指向需要继承属性的对象的时候(apply和call)

function People(gender) {
this.gender = gender;
this.sayGender = function() {
console.log(this.gender);
}
} var sally = new People("women"); var bob = { // bob是直接量创建的,但是没有sayGender方法可以用
gender: "man";
}

所以这里如果bob要用 sayGender() 方法的话要怎么破呢?这个时候就要用到 apply() 或者 call() 了,这两个方法差不多。

  • apply(obj, arguments) 这里的arguments是一个参数数组
  • call(obj,argument) 这里没有复数

所以bob要调用 sayGender() 的话,就要用到 call() 方法或者 apply() 方法了。

这个其实可以理解为继承的一种,Java里面继承分为实现继承跟接口继承两种,JavaScript的继承是只有实现继承的,但是实现继承JavaScript里面又有很多种,比如原型链继承,还有这里的 apply()call() 也算是继承的一种。

function People(gender) {
this.gender = gender;
this.sayGender = function(str) {
console.log(this.gender);
}
} var sally = new People("women"); var bob = { // bob是直接量创建的,但是没有sayGender方法可以用
gender: "man";
} sally.sayGender("这是什么性别的?"); // 这是什么性别的?women
sally.sayGender.call(bob,"这是什么性别的?"); // 这是什么性别的?man

这里最后一句代码的执行过程分析下:

  1. 将bob{gender: “man”}这个对象传递到People里面
  2. 更改函数里面this指向
  3. 继续执行函数里面其他代码

这里可以看出,bob这个对象继承要继承另外一个对象的某个方法的时候可以用上面这种写法 function.call(obj, argument)

同时也可以知道,this在函数里面的指向其实是可以有很多种的,要根据不同的环境来判断。

下面开始apply的例子,在开始 apply() 的例子之前先普及一下基本知识:

首先普及下一个概念 类数组(array-like) ,类数组其实我们平时接触的很多的。比如函数里面的 arguments对象 ,注意这里说的是 arguments对象 而不是 arguments数组 。因为arguments不是一个数组而是一个对象,只是我们平时用的时候喜欢用 arguments[0] 这样的写法所以看起来像数组而已。类数组通常的定义就是 有维护一个length属性可以根据数字下标来获取元素 比如 arguments[0] 这样的一个对象。

不信的话我们可以测试下的:

function arrayLike() {
console.log(arguments instaceof Array); // false
console.log(arguments instaceof Object); // true
}
arrayLike();

其实JavaScript里面的数组对象叫 关联数组 ,也就是我们数据库表那样的 键-值对 组成的形式。所以你如果以为JavaScript可以像其他语言那样优化循环比如 for(var i=0; i<100; i++) 这样的过程的话你就想多了。
甚至,JavaScript的对象内部实现也是
关联数组
,比如你可以定义键为0而值为其他的对象。

var obj = {
0: "12345"
}
var arr = ["12345"];
console.log(obj[0]); // 12345
console.log(arr[0]); // 12345

有没有觉得JavaScript内部的实现其实很简单?或者可以说原理基本上就一个,但是通过简单的加点属性减点属性让对象跟数组看起来完全不一样。其实内部的实现原理是一模一样的。

废话扯得有点多,下面看 apply() 方法的例子:

function People(gender) {
this.gender = gender;
this.sayGender = function() {
var str = Array.prototype.join.call(arguments,""); // arguments为类数组
console.log(str + this.gender); //
}
} var sally = new People("women"); var bob = {
gender: "man"
} var textArr = "这是什么性别的?".split(""); // 这里将字符串分割为数组 sally.sayGender.apply(bob, textArr); // 这是什么性别的?man

大概就到这里吧,有兴趣的可以留言讨论下。

JavaScript中this关键字的使用比较的更多相关文章

  1. 深入解析Javascript中this关键字的使用

    深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...

  2. [No000069]Javascript中this关键字详解

    Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...

  3. 大前端学习笔记整理【五】关于JavaScript中的关键字——this

    写在前面 工作有那么一段时间了,但是在工作中,发现自己的理论知识还是有所欠缺.特别是在javascript上,很多东西其实自己属于知道要用这个,但是不知道为什么要这么用...这种情况很是尴尬了,所以写 ...

  4. javascript中this关键字详解

    不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法.强烈推荐. 以下篇幅有点长,希望读者耐心阅读. 以下内容会分为如下部分: 1.涵义 1.1:th ...

  5. JavaScript中var关键字的使用详解

    作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? ...

  6. javascript中的关键字和保留字

    javascript中关键字的问题,将名称替换了下,确实就没有问题了.现在将它的关键字和保留字贴出来,便于日后查看和避免在次出现类似的问题. 1 关键字breakcasecatchcontinuede ...

  7. javascript中new关键字详解

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  8. 深入了解JavaScript中的关键字

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分四种情况,详细讨论this的用法,感兴趣的朋友可以了解下. this是Javascri ...

  9. 对于JavaScript中this关键字的理解

    这是我第二遍学this了,第一遍学的懵懵的.this指哪里都是凭我一个男人的直觉然后控制台输出看看对不对. 刚查了书.博客.视频.理解差不多了.毕竟菜鸡me: 一.首先介绍下什么是this this是 ...

随机推荐

  1. 因为td设置relative导致td的border问题

    在ff下因为td设置relative导致td的border问题:其实是个老问题了~碰到了拿出来记录下 td 中添加如下样式 background-clip: padding-box

  2. 关于canvas绘制大转盘并旋转

    O(∩_∩)O包子不才,最近磕磕巴巴写了一个大转盘的效果.现在想说一下整个的思路部分,要是有设么不对的还请多多指教,期待共同成为优秀的前端~~大转盘整个思路: 绘制整个转盘 编写一个随机数,用来当接口 ...

  3. Understanding Tensorflow using Go

    原文: https://pgaleone.eu/tensorflow/go/2017/05/29/understanding-tensorflow-using-go/ Tensorflow is no ...

  4. 为Visual SVN使用签名后的域名证书

    装了个VisualSVN Server管理代码,可每次浏览的时候都会提示证书有问题,要不要继续神马的,好烦人,于是搜索了一下免费SSL证书,申请了一个,虽然不是绿的,但总算是不报问题了. 下面是整个过 ...

  5. Pandas常用操作方法

    Pandas pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. pandas提 ...

  6. Kubernetes网络框架

    // cmd/kubelet/app/server.go -1.func UnsecuredKubeletDeps(s *options.KubeletServer) (*kubelet.Kubele ...

  7. JavaScript教程3-js深入

    1.JS流程控制语句 (1).if 判断 if 语句是基于条件成立时才执行相应的代码. if...else 语句是在指定的条件成立时执行if后的代码,在条件不成立时执行else后的代码. if...e ...

  8. Android项目使用Ant多渠道打包(最新sdk)

    参考文章: http://blog.csdn.net/liuhe688/article/details/6679879 http://www.eoeandroid.com/thread-323111- ...

  9. git常用命令总结(转载)

    Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一.新建代码库 # 在当前目录新建一个Git代码库 $ git in ...

  10. [StringUtil ] isEmpty VS isBlank

    昨天才意识到这两个的存在. Blank(空字符串 blank) StringUtils.isNoneBlank(null) = false StringUtils.isNoneBlank(null, ...