首先来了解一下JS中this的原理:

要访问自己的属性就必须使用 this.属性名

1.this总是指向它的直接调用者:

var a={
user:'Artimis',
fn:function(){
console.log(this.user)
}
} a.fn() //Artimis => this指向a var b=a.fn;
b() //undefined => this指向window 2. 如果没有找到直接调用者,this就指向window
function fn(){
var user='Artimis';
console.log(this.user)
}
fn() //undefined => this指向window 3.遇到return,如果返回的是对象,则this指向返回对象,否则指向函数function A(){
this.user='Artimis';
return {} //return一个空对象
} var a=new A();
console.log(a.user) //undefined => this指向return的{} function B(){
this.user='Artimis';
return 1 //return一个数值
} var b=new B();
console.log(b.user) //Artimis => this指向b

还有最后一种,就是当使用call,apply,bind绑定的时候,this就指向绑定对象 这里说一下call,apply以及bind的异同:
call和apply:相同点都是临时借用一个函数,并替换this为制定对象,不同点在于传参方式不一样,并且都是立即执行;
bind:基于现有函数,创建一个新函数,并且永久绑定this为其指定对象,可绑定参数,不过只是创建函数,不立刻执行。 举个例子:
//定义一个add 方法 function add(x, y) { return x + y; }
//用call 来调用 add 方法
function myAddCall(x, y) {
//调用 add 方法 的 call 方法
return add.call(this, x, y); }
//apply 来调用 add 方法
function myAddApply(x, y) {
//调用 add 方法 的 applly 方法
return add.apply(this, [x, y]);
}
console.log(myAddCall(10, 20));
//输出结果30
console.log(myAddApply(20, 20));
//输出结果40 从这里可以看出来call和appli都调用了add的方法, 还可以通过this改变作用域:

var name = '小王';

var obj = {name:'小李'};

function sayName() {
return this.name;
}

console.log(sayName.call(this)); //输出小白

console.log(sayName. call(obj)); //输入小红

this还能实现继承

function Animal(name){
this.name = name;
this.age = 15;
}

function Cat(name){
Animal.call(this, name);
this.catName = 'cat';
}

let o1 = new Cat('test1');
console.log(o1);
//Cat {name: "test1", age: 15, catName: "cat"}



JS中this和call的更多相关文章

  1. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  2. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  3. JS中给正则表达式加变量

    前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下.   一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...

  4. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  5. 关于js中的this

    关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...

  6. 表值函数与JS中split()的联系

    在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...

  7. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  8. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  9. 分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  10. 如何在Node.js中合并两个复杂对象

    通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...

随机推荐

  1. osg 在场景中绘制坐标轴(xyz)

    //x y z font_size osg::Geode* makeCoordinate(float a_x,float a_y,float a_z,float font_size) { osg::r ...

  2. iOS-系统bool理解

    typedef signed char BOOL; #if !defined(YES)    #define YES (BOOL)1 #endif #if !defined(NO)    #defin ...

  3. linux一行命令查杀进程

    https://blog.csdn.net/primeprime/article/details/52415273 ps -efww | grep -w 'helloworld' | grep -v ...

  4. Java实现回形数,只利用数组、循环和if-else语句

    import java.util.Scanner; public class learn { public static void main(String[] args){ System.out.pr ...

  5. cadence 16.3 安装教程

    http://wenku.baidu.com/link?url=mGICX2QxuxVcYGNEaOIUOK1t0LQFN4m8cp_bJF0XmvZp0TLn8OoMxjmXa-8mTa0_V0YV ...

  6. Python: 对于DataFrame.loc传入列表和传入元组输出区别的理解

    def test(): import pandas as pd tuples = [ ('cobra', 'mark i'), ('cobra', 'mark ii'), ('sidewinder', ...

  7. for i in range()

    for i in range()就是python中的循环语句 有以下三种常见用法: 1.range(3) [0,3)即0,1,2 2.range(1,3) [1,3)即1,2 3.range(1,5, ...

  8. python 使用 RabbitMQ

    一.RabbitMQ消息队列介绍 RabbitMQ是在两个独立得python程序,或其他语言交互时使用. RabbitMQ:erlang语言 开发的. Python中连接RabbitMQ的模块:pik ...

  9. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  10. [转帖]年度网络攻击大调查:SSH端口最易受网络攻击,HTTPS其次!

    年度网络攻击大调查:SSH端口最易受网络攻击,HTTPS其次! https://zhuanlan.kanxue.com/article-9431.htm 一般来说,人们会通过检查端口.更新设备等多种措 ...