通过一段代码学习javascript基础知识系列

第二节 - this用法

this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时也带来了编程上的自由和灵活,结合apply(call)方法,可以使JS变得异常强大。

this指向的对象,可以通过以下三点区分:


  1. .当函数仅仅作为函数执行的时候,this指向的是全局的。

  2. .当函数作为构造函数执行的时候,this指向的是当前创建的对象。

  3. .当函数作为对象的方法执行的时候,this指向的是当前的对象。

注意:

为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示。

由于代码中使用了console.log或dir方法,因此如果在ie中执行,请自行替换为alert或注释掉。

下面通过代码来解释上述三点。

一、当函数作为函数执行的时候

有以下函数:

function A(){
this.a = "isea533";
console.log(this.a);
}

依次在console中输入(请不要输入注释内容):

//创建函数A()

function A(){
this.a = "isea533";
console.log(this.a);
}

undefined

//输入a,查看全局变量a

a

//返回结果为a 未定义

ReferenceError: a is not defined

//执行函数A() -- 这里是作为函数执行

A()

//console.log输出结果

isea533

undefined

//输入a,查看全局变量

a

//此时a已经有值了,说明函数A()执行的this.a是全局的。

"isea533"

//给全局a赋值1

a = 1;

1

//输入a,查看全局变量此时结果为1

a

1

//再次执行函数A

A();

isea533

undefined

//函数A执行后,a的值发生改变,从1变成isea533

a

"isea533"

上面的执行结果已经可以说明,当作为函数执行的时候,this为全局的。

二、当函数作为构造函数执行的时候

仍然使用上述函数A()

依次在console中输入(请不要输入注释内容):

function A(){
this.a = "isea533";
console.log(this.a);
}

undefined

//创建对象obj,构造函数执行过程中输出this.a

var obj = new A();

isea533

undefined

//查看对象的属性a

obj.a

"isea533"

//创建对象obj2

var obj2 = new A();

isea533

undefined

//查看obj2的属性a

obj2.a

"isea533"

//改变obj的属性a的值

obj.a = "isea";

"isea"

//查看obj2的属性a的值,没有改变

obj2.a

"isea533"

//查看全局变量a,结果为未定义

a

ReferenceError: a is not defined

三、当函数作为对象的方法执行的时候

其实第三条可以归到第二条中,因为这结果是显而易见的,这里主要是为了说明一些常见的情况,所以特地单独讲解。

有如下html代码:

<input type="text" id="username" value="isea533" onclick="console.log(this.value)"/>
<input type="text" id="age" value="30" />
<script>
function A(){
console.log(this.value);
}
document.getElementById("age").onclick = A;
</script>

在这两种方式中,我们可以看到this在这里就是指向的相应的input对象。

这是由于我们把onclick事件添加到了Dom对象上,所以this会指向当前的Dom对象,而不是全局对象。

我们在看另一种情况:

依次在console中输入(请不要输入注释内容):

//创建全局变量a

var a = "isea533";

undefined

//创建函数A

function A(){
console.log(this.a);
}

undefined

//创建对象c,c有属性a

var c = {a:"isea"}

undefined

//向c增加方法log = A;

c.log = A;

function A(){
console.log(this.a);
}

//执行c的log方法,输出c的属性a而不是全局的a

c.log();

isea

undefined

//查看全局对象a,值没有发生改变

a

"isea533"

//执行函数A,输出全局对象a的值

A();

isea533

undefined

//新建对象e = A

var e = A;

undefined

//执行e,这里e()和A()是一样仅仅作为函数执行的,e是函数,不是对象

e()

isea533

undefined

//我们使用toString.call验证一下,这里e是Function

toString.call(e)

"[object Function]"

//这里c是Object

toString.call(c)

"[object Object]"

通过上面的例子代码,我想你应该对this有一定的了解了,了解this指向在Js编程过程中非常的有用,了解这一点可以在使用过程中方便许多,也能避免出错。

相关阅读:

阮一峰:Javascript的this用法

学习javascript基础知识系列第二节 - this用法的更多相关文章

  1. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  2. JavaScript学习---JavaScript基础知识

    JavaScript的引入方式 JavaScript的引入方式: 1.直接在script里面写: 2.使用<script src="JS的文件位置"> {#1 直接编写 ...

  3. HTML学习笔记 基础表格案例 第二节 (原创) 参考使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  5. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  6. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  7. C# 基础知识系列- 14 IO篇 流的使用

    0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...

  8. 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...

  9. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

随机推荐

  1. Linux grep 命令中的正则表达式详解

    在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式(extended regular expres ...

  2. ORACLE REFERENCES FRO TEST

    [JSU]LJDragon's Oracle course notes In the first semester, junior year Oracle考前复习 试题结构分析: 1.选择题2x10, ...

  3. mongodb授权登录

    mongodb版本为3.2(目前最新),演示的是linux下的mongodb授权认证 第一次登录不启动授权(mongo默认不启动) ./mongod --dbpath=/home/db/data -- ...

  4. 魅蓝Note有几种颜色 魅蓝Note哪个颜色好看

    http://www.pc841.com/shoujizhishi/39882.html http://news.mydrivers.com/1/359/359443.htm 魅族发布首款千元高性价比 ...

  5. POJ2431 Expedition(排序+优先队列)

    思路:先把加油站按升序排列. 在经过加油站时.往优先队列里增加B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.假设队列为空(能够理解成预存储的油量),则无法到达下一个加油站,更无法到 ...

  6. MFC原创:三层架构01(人事管理系统)DAL

    VC++/MFC Window编程原创教程文件夹 C++课程设计来着.但还没学过数据,也还没理解过三层架构,就把这个作业深化点来做了.尽管要做的这个人事管理系统看起来是挺简单的,无非就是处理员工信息. ...

  7. 在VM中安装Android4.4连接小米手环 之 在VM中安装Android4.4

    今天刚买了个小米手环,系统须要4.4及以上,但自己手机系统版本号不匹配.故打算在VM中安装Android4.4连接小米手环. 这一节先介绍在VM中安装Android4.4(怎么安装VM就不介绍了) 1 ...

  8. 关于MyEclipse查看底层源码出现source not found的问题(MyEclipse、Eclipse配置JAD)

    一.MyEclipse 第一步:      下载jad.exe文件:jad下载地址 eclipse插件:net.sf.jadclipse_版本号.jar下载地址一 net.sf.jadclipse_版 ...

  9. Stack and queue.

    队列的定义及基本运算 1.定义    队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rea ...

  10. 栈溢出之rop到syscall

    当程序开启了nx,但程序有syscall调用的时候.这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve('/bin/sh',null,null),这是这次alictf一道pw ...