A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

经验/问题描述:

在 js 中,无论是函数, 还是方法, 还是事件, 还是构造器...这些东西的本质都是函数,其中的区别只是所处的位置不同。根据函数内部this的指向不同,可以将函数的调用模式分成4种:函数模式、方法模式、构造器模式和上下文模式等四种不同的调用模式。

解决方法:
首先先来分析this指向问题:

1、任何函数都有属于自己的this

2、this的指向和函数的调用模式相关,意味着this的指向在函数声明的时候确定不了。然后分析this指向的思路:

1、this是属于哪个函数的

2、这个函数的调用模式是哪种

四种调用模式

1、函数模式

特征:简单的函数调用,函数名前面没有任何引导内容。

this 的含义: 在 函数中 this 表示全局对象, 在浏览器中this表示window。
注:任何自调用函数都是函数模式
2、方法模式
特征: 方法一定是依附于一个对象,将函数赋值给对象的一个属性,那么就成为了方法。

this的含义:这个依附的对象
注:arguments 这种伪数组, 或者 [] 数组这样的对象中, 这样调用函数也是方法调用, this 会只指向对象。
3、构造器模式(构造函数模式,构造方法模式)
特征:
(1)、使用 new 引导构造函数, 创建了一个实例对象

(2)、在创建对象的同时, 将this指向这个刚刚创建的对象

(3)、在构造函数中, 不需要 return , 会默认的 return this

分析:

由于构造函数只是给 this 添加成员, 而方法也可以完成这个操作,对与 this 来说, 构造函数和方法没有本质区别

关于return的补充:

在构造函数中,普通情况,可以理解为构造函数已经默认进行了return this,添加在后面的都不会执行

如果手动的添加 return ,就相当于 return this.

如果手动的添加 return 基本类型(字符串, 数字, 布尔), 无效, 还是 return this

如果手动的添加 return null 或 return undefined, 无效, 还是 return this

特殊情况, return对象, 最终返回对象

手动添加return对象类型,那么原来创建的this会被丢掉,返回 return 后面的对象

4、上下文调用模式

特征:上下文调用模式也叫方法借用模式,分为apply与call,上下文 就是环境, 就是自定义设置this的含义

语法:

函数名.apply(对象,[参数]);

函数名.call(对象,参数);

描述:

函数名就是表示的函数本身, 使用函数进行调用的时候默认 this 是全局变量

函数名也可以是方法提供, 使用方法调用的时候, this 是指当前对象.

使用apply进行调用后, 无论是函数,还是方法都无效了。我们的 this, 由apply的第一个参数决定

注意:

如果函数或方法中没有 this 的操作, 那么无论什么调用其实都一样.

如果是函数调用foo(),那么有点像foo.apply(window).

如果是方法调用o.method(),那么有点像o.method.apply(o).

无论是call还是apply在没有后面的参数的情况下(函数无参数,方法无参数)是完全一样的。

第一个参数的使用也是有规则的

如果传入的是一个对象, 那么就相当于设置该函数中的 this 为参数

如果不传入参数, 或传入null、 undefiend 等, 那么相当于this默认为 window。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马