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)。所有涉及它们的引用,都会沿袭向上查找外层作用域链的方案来处理。
随机推荐
- Windows内核 基本数据结构
驱动对象: 每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并 ...
- PHP 上传大文件
- java环境搭建系列:JDK从下载安装到简单使用
最近,问的比较多的问题居然是jdk的问题,对于新手来说这确实有点难度,毕竟一个人经常上网浏览新闻和观看视频的人,一下子开始一门编程语言的环境搭建.这中间需要一个慢慢适应的过程.回想当初我在这个阶段也很 ...
- HDU 1160 FatMouse's Speed(要记录路径的二维LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Javascript备忘模式
使用备忘模式,利用了函数的自定义属性,先看一个例子 var test = function (){} test.myAttr = "attr"; 这样,就给test加上了一个自定义 ...
- C# 拷贝数组的几种方法
已知数组如下: int[] array = { 1, 5, 9, 3, 7, 2, 8 ,6, 4}; (1).引用复制,易引起错误,不推荐 int[] copy = array; (2).遍历拷贝 ...
- Java基础总结(备考)
ps1:本文内容只涉及基础中的重点,大神直接无视路过. ps2:部分内容可能不太详细,有疑问请留言. ps3:全文自己总结(部分知识百度),内容可能有些杂,可能不太全. 如有雷同,算我抄你,同时欢迎大 ...
- tableView主从表在storyboard连线是 Selcetion Segue和Accessory Action的区别
当按住Ctorl这样连线时会出现,当选择Selection Segue下面的push时,点击cell的任何位置都会跳转到下一个tableView,当选择Accessory Action的下面的push ...
- 安卓和ios的lineheight的不一样如何解决?
lineheight在pc端上显示很正常,但是在手机就很不同,在iphone6上,设置了lineheight,但是文本上面多了几像素,如果你设置lineheight在35px一下的按钮(用span做的 ...
- iOS:高德地图的使用
本人花了点时间集成了高德地图的几乎所有的功能,包含:地图的显示.地图的绘制.地图的定位.地图的POI数据检索.地图的线路规划.地图导航等下载地址如下:https://github.com/xiayua ...