学习javascript基础知识系列第二节 - this用法
第二节 - this用法
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时也带来了编程上的自由和灵活,结合apply(call)方法,可以使JS变得异常强大。
this指向的对象,可以通过以下三点区分:
.当函数仅仅作为函数执行的时候,this指向的是全局的。
.当函数作为构造函数执行的时候,this指向的是当前创建的对象。
.当函数作为对象的方法执行的时候,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基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- JavaScript学习---JavaScript基础知识
JavaScript的引入方式 JavaScript的引入方式: 1.直接在script里面写: 2.使用<script src="JS的文件位置"> {#1 直接编写 ...
- HTML学习笔记 基础表格案例 第二节 (原创) 参考使用表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- C# 基础知识系列- 14 IO篇 流的使用
0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...
- 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))
关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...
- Javascript基础知识总结一
Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
随机推荐
- SQL with as 替代临时表的用法
原文地址:http://www.cnblogs.com/zerocc/archive/2011/11/28/2266180.html SQL中 WITH AS 的用法和注意事项 1.为什么使用with ...
- Oracle_Q&A_04
2014-12-19作业 [JSU]LJDragon's Oracle course tasks In the first semester, junior year --1.在管理员权限下创建一个新 ...
- .net 面试题(3)
96.题目: 活期存款中,"储户"通过"存取款单"和"储蓄所"发生联系.假定储户包括:账号,姓名,电话,地址,存款额:"储蓄所&q ...
- Python爬虫实战(一)
今天,学习了爬虫的基础知识,尝试着写了本人的第一个小爬虫——爬取糗百上的热门段子.一开始自己做的是爬取1-35页,每页20条段子的作者.点赞数和内容,代码很简陋,贴在下面: #!/usr/bin/en ...
- javascript--瀑布流
简单瀑布流代码实现 html代码例如以下 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...
- Codeforces 486C Palindrome Transformation(贪心)
题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...
- coco2d-html5制作弹弓射鸟第一部分---橡皮筋
一.写在前面的话 最近在学习cocos2d-html5方面的知识,一直想从事游戏方面的工作,自己也找了好多资料.网上关于cocos2d-html5的教程真的不多,也只有自己摸索,慢慢看示例代码.由于本 ...
- [Angular 2] Using Promise to Http
You can also use Promise for http: So for the service, you need to call toPromise() method: getVehic ...
- android requestDisallowInterceptTouchEvent用途
ViewPager来实现左右滑动切换tab.假设tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比方想滑动tab项中的可水平滑动的控件,却导致tab切换. 由于Android事件机制是从父 ...
- Android--Service之绑定服务交互
前言 开篇名义,这篇博客介绍一下Android下使用绑定服务进行时数据交互的几种方法.关于Android下Service的内容,前面两篇博客已经介绍了,不清楚的可以移步过去先看看:Android--S ...