今天跟大家一起简单的来了解一下js中一个有趣的东西,this.

  在js中我们用面向对象的思想去编写的时候,各个模块之间的变量就不那么容易获取的到了,当然也可以通过闭包的方式拿到其他函数的变量,如果说每获取一个变量,都要用闭包的方式去获取,就显得太繁琐了,这时候js中也提供了一种方法来获取其他的变量,当然前提是这些函数之间是有联系的,比如函数2是绑在函数1的原型上的,那么函数1中用this指明的一个变量,在函数2中同样可以用this来获取到,当然着其中是有着一定的规则的。那么接下来我给大家对this做一个详细的介绍

一:到底什么是this呢?

  概念:执行上下文,this一般存在于函数中,表示当前函数的执行上下文, 如果函数没有执行,那么this没有内容,只有函数在执行后this才有绑定。

  注意:this的指向只能是对象,当然别忘记了数组也是一个特殊的对象。

二:this到底指向的是谁呢?

  this的指向其实是跟this的执行位置是有关的,不同的位置执行位置,this的指向就可能发生改变。

  Tip:this被谁执行了,this就是执行谁的,这时候一定要看清楚this是被谁直接执行的!

  那么接下来给大家总结几种this指向的问题。

1:默认执行:this指向了window,在严格模式下,this指向了undefined

eg:
function fn(){
"use strict";
console.log(this);
}
fn();
这个时候在严格模式下,指向的是undefined,去掉严格模式,指向window

2:隐式执行(通过对象执行):通过上下文对象执行

tip:隐式执行粗体上分为五种,在隐式执行的过程中,可能会改变执行对象,也可能会出现隐式丢失,从而改变了当前的this

这里给大家整理五种常见的this错误指向的例子

2.1改变函数引用

    eg:
var obj = {
name:'admin',
show:function(){
console.log(this.name);
}
}
var newShow = obj.show;
newShow();
//this指向了window,函数的执行对象变成了window

 2.2函数传参

eg:
var name='window';
var obj = {
name: 'obj',
show: function(){
console.log(this.name);
}
}
function trigger(fn){
fn();
}
trigger(obj.show);
//this指向window

2.3:定时器传参

 var name='window';
var obj = {
name: 'obj',
show: function(){
console.log(this.name);
}
}
setTimeout(obj.show,);
//this指向了window

2.4:DOM对象事件

 var name = 'window';
var oHtml = document.documentElement;
var obj = {
name: 'obj',
show: function(){
console.log(this.name);
}
}
oHtml.name = 'DOM';
oHtml.onclick = obj.show;
//this指向了window

2.5:arguments类数组改变this指向问题

tip:传入过多的实参,多余的实参虽然没有什么用,但也是保存在函数中了
        var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn){
fn();
arguments[0]();
}
};
obj.method(fn,"111","222");
//打印结果为10,3 tip1:
  obj.method的value并不是一个可以直接直接执行的函数,通过obj.method并不能执行函数,
      所以this指向的并不是obj,输出的不是5,this指向的是function这个无名函数,他的执行对象直接是window,发生隐式丢失
但是arguments[0]();也会执行,因为传入的第一个参数就是一个函数,同时传进了两个多余的实参,所以打印出的为3
tip2:
数组是很特殊的对象,他的索引值相当于是obj2对象中的属性值。所以说数组,类数组也会改变this指向问题。

3:显示执行

  通过函数的bind或call或apply执行

  tip:当发生隐式执行的时候,还希望能拿到指定的this,可以通过函数的一些方法,强行改变到指定的this

  这里拿bind方法给大家做一下介绍

  blind()方法;执行结束后,会返回一个新函数,新函数是被改变了this和参数的老函数
bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入bind()方法的第一个参数作为this,
传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
tip:改变this的指向,简单来说,可以让没有这个功能的对象,具有另一个对象的功能
当blind();有多个参数的时候,第一个参数表示this的指向,其他的参数会与原函数的参数一起放在新函数中
eg1:
var a = {
name:"admin"
}
var b = {
name:"uesr",
show:function(){
console.log(this.name);
}
}
b.show();
var c = b.show.bind(a);
c();
//此时的c能够获取到a里面的name,利用a强行将this指向了a eg2:
常用方式,用来改变函数内计时器函数this的指向
for(var i=;i<ali.length;i++){
ali[i].onclick = function(){
setTimeout(function(){
console.log(this)
}.bind(this),)
}
}
//不用blind()方法,this直接指向的是window,强行给计时器函数加了blind()方法,这时候谁触发了函数的执行,this就指向了谁。

4:new绑定

  利用面向对象思想编程的时候,我们通过new创建这个函数对象的时候,那么这个this就指向了被new出来的对象,也就是所谓的new绑定

注:以上知识均为本人总结原创,转载请著名博客出处:https://www.cnblogs.com/jiuxia/

js中的this介绍的更多相关文章

  1. JS中数组的介绍

    一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...

  2. JS中闭包的介绍

    闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascri ...

  3. JS中的闭包 详细解析大全(面试避必考题)

    JS中闭包的介绍   闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变 ...

  4. Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...

  5. js中的json对象详细介绍

    JSON一种简单的数据格式,比xml更轻巧,在JavaScript中处理JSON数据不需要任何特殊的API或工具包,下面为大家详细介绍下js中的json对象, 1.JSON(JavaScript Ob ...

  6. JS中令人发指的valueOf方法介绍

    彭老湿近期月报里提到了valueOf方法,兴致来了翻了下ECMA5里关于valueOf方法的介绍,如下: 15.2.4.4 Object.prototype.valueOf ( ) When the ...

  7. 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍

    一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...

  8. js中关于Blob对象的介绍与使用

    js中关于Blob对象的介绍与使用   blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是 ...

  9. js中push和join方法使用介绍

    push和join方法想必大家并不陌生吧,在本文将为大家详细介绍下js中的push和join方法的使用.代码: <script type="text/javascript"& ...

随机推荐

  1. jQuery插件之路(二)——轮播

    还记得以前刚接触前端的时候,浏览各大网站,很多都少不了的有个轮播的效果,那个时候自己是一个彻彻底底的小白,想着这些图片滚动起来还真是有意思,是什么让这些图片在一个方向上连续的滚动呢.后来慢慢的接触多了 ...

  2. 佳木斯集训Day6

    T1还是个找规律啊,记下b的个数,然后直接*2%10000000009就好了 #include <bits/stdc++.h> #define mo 1000000007 using na ...

  3. Activiti 开发案例之动态指派任务

    流程图 以上是一个请假的流程图,以下为流程任务节点描述: 员工发起请假流程 部门经理审批 同意则进入人事审批 拒绝则调整申请或者直接结束流程 人事审批通过则进入销假环节 人事审批拒绝则调整申请或者直接 ...

  4. spring cloud stream 经验总结

    ---恢复内容开始--- 基本概念 spring: cloud: stream: kafka: binder: brokers: cloudTest:19092 zk-nodes: cloudTest ...

  5. RE最全面的正则表达式----终结篇 特殊处理

    三.特殊需求表达式 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0- ...

  6. XML学习(二)

    1.上期回忆 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空 ...

  7. 8.15 day33 进程池与线程池_协程_IO模型(了解)

    进程池和线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? ​ 在保证计算机硬件安全的情况下最大限度地利用计算机 ​ ...

  8. 解决!!-- krb5-libs.x86_64被卸载,yum不能使用,ssh不能连接

    常在河边走哪有不湿鞋,常玩服务器哪有不搞挂几台,一不小心就搞挂了 今天删除 krb5-libs.x86_64下了狠功夫..... 用了命令: rpm -e --nodeps  krb5-libs.x8 ...

  9. 用 Python 分析上网记录,发现了很多不可思议的事

    摘要:分享个​ Python 神工具.​ 长时间使用浏览器会积累大量浏览器历史记录,这些是很隐私的数据,里面甚至可能有一些不可描述的网站或者搜索记录不想让别人知道. 不过,我们自己可能会感兴趣,天天上 ...

  10. 集合系列 List(三):Vector

    Vector 的底层实现以及结构与 ArrayList 完全相同,只是在某一些细节上会有所不同.这些细节主要有: 线程安全 扩容大小 线程安全 我们知道 ArrayList 是线程不安全的,只能在单线 ...