今天跟大家一起简单的来了解一下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. 五、Python基础(2)

    五,Python基础(2) 1.数据类型基础 (一)什么是数据类型? 用于区分变量值的不同类型. (二)为何对数据分类? 针对不同状态就应该用不同类型的数据去标识. (三)数据类型分类 1.数字类型 ...

  2. 网站安装SSL证书成为影响SEO排名的重要因素之一

    百度谷歌先后发声明倡导站长们使用https链接,同样的网站,https站点要比http站点拥有更好的排名权重.https已经是网站SEO必须要考虑的环节之一了,而https的必要条件就是安装SSL证书 ...

  3. 史上最全面的SignalR系列教程-1、认识SignalR

    SignalR 是什么? SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用, ...

  4. Linux下安装jupyter

    又是美好的一天     开开心心写代码 1. 安装ipython, jupyter pip install ipython pip install jupyter 2. 生成配置文件[root@50e ...

  5. mysql优化---订单查询优化(1):视图优化+索引创建

    订单的表结构采用了垂直分表的策略,将订单相关的不同模块的字段维护在不同表中 在订单处理这个页面,需要查询各种维度, 因此为了方便查询创建了v_sale_order视图(老版本) drop view v ...

  6. Mysql 局域网连接设置——Windows

    在公司工作中,会遇到mysql数据库存储于某个人的电脑上,大家要想连接mysql服务,装有mysql服务的电脑就必须开启远程连接. 其实不仅仅是局域网,只要你有数据库所在服务器的公网IP地址都能连上. ...

  7. jquery验证大全

    jQuery验证及限制 绑定键盘监听事件 $(document).on("keypress", ".txt-valid-len", function (e) { ...

  8. postman 测试http,接口

    1.form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...

  9. stm8s和stm8l低功耗对比

    在低功耗应用中,一般来说mcu是常态halt模式,然后偶尔被唤醒(外部中断或者内部定时唤醒)进入运行模式.所以对比低功耗性能,一般来说只需要对比run模式和halt下的功耗即可,因为项目选用的是通过内 ...

  10. 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...