9-this
第九课 this
一、this基本概念
this是Javascript语言的一个关键字。在JavaScript中,this是动态绑定,或称为运行期绑定的。在不同的情况下,this指向各不相同。但是有一个总的原则,那就是this指的是,调用函数的那个对象。
1.全局范围内
当在全部范围内使用 this,它将会指向全局对象,在浏览器中,window 就是该全局对象。
2.函数调用
this指向全局对象,即windows
var name = 'Jeepeng';
function showName() {
console.log(this.name);
}
showName();
3.对象方法调用
在对象方法调用中this指向对象
var person = {
name: 'Jeepeng',
showName: function() {
console.log(this.name);
}
};
person.showName();
4.构造函数调用
在构造函数内部,this指向新创建的对象。
function Person(name) {
this.name = name;
}
var person = new Person('Jeepeng');
console.log(person.name);
var person1 = Person(‘Lily’);
// 函数调用,this指向windows
JavaScript 中的构造函数很特殊,如果不使用 new 调用,则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。如果调用正确,this 绑定到新创建的对象上。
二、this可改变(重点)
1.使用apply或call调用
call和apply的作用是改变函数执行时的上下文,即改变函数运行时的this指向。二者的作用完全一样,区别只在于这两个函数接受的参数形式不同。
var person = {
name: 'Jeepeng',
showName: function() {
console.log(this.name);
}
};
var newPerson = {name: 'Lily'};
person.showName.call(newPerson);
function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]);
// 数组将会被扩展,如下所示
foo.call(bar, 1, 2, 3);
// 传递到foo的参数是:a = 1, b = 2, c = 3
当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被 显式设置为函数调用的第一个参数。
2.bind
bind与call很相似,不过bind的返回值是函数
var person = {
name: 'Jeepeng',
setName: function (name) {
this.name = name;
},
showName: function() {
console.log(this.name);
(function() {
this.setName('Lily');
}.bind(this))();
}
};
person.showName();
3.箭头函数
箭头函数并不绑定 this,arguments,super(ES6),抑或 new.target(ES6)。所有涉及它们的引用,都会沿袭向上查找外层作用域链的方案来处理。
随机推荐
- gvim配置
colorscheme darkblue set lines=100 set columns=150
- 关于linux密码忘记问题解决方法
最近在试装centos,不小心把密码丢了,进不去,查了一下资料,找到了方法,试验成功.存在这里,备用. 1. 在出现grub画面时,用上下键选中你平时启动linux的那一项,然后按e键 2. 再次用上 ...
- javascript:正则大全
:replace函数,为写自己的js模板做准备 待完善 function 1,声明&用法 //数组: var arr=[];//字面量 var arr=new Array();//构造函数 / ...
- django 动态更新属性值
django 动态更新属性值 class TestTime(models.Model): """ 功能说明:指定测试的每一关总用时 """ ...
- mac El Capitan 10.11.6
http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1702502&authorid=4532202&page=1
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- SharedPreferences第一次使用后HashMap将常驻内存
今天使用SharedPreferences的时候突然想到了这个问题,因为我们要存储应用级别的上下文信息,包括用户信息等一系列信息:这个时候使用getSharedPreferences是否合适呢! 其实 ...
- MVC 区域功能
因为MVC项目是要求都放在固定的文件夹,所以,当项目大的时候,会很不方便管理,所以微软引入的区域的功能 使用方法: 在项目上右击--添加--区域 就会出现Areas的文件夹,里面就是子MVC 渲染: ...
- VS2012+Win7网站发布详细步骤
VS2012+Win7网站发布详细步骤 本机环境: 本文分三个部分介绍Web项目发布的常规方法,大神级别可以略过,主要是为了方便一些初学者. 第一部分:VS2012把项目发布到文件系统. 第二部分:I ...
- ASP.NET 文件后缀名详解
sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:Web 窗体页由两部分组 ...