函数模式
简单的函数调用,前面没有任何引导内容
function foo(){} var func=function(){}; ... foo(); func(); (function(){})()
this 的含义: 在 函数中 this 表示全局对象, 在浏览器中this表示window。
注:任何自调用函数都是函数模式
方法模式
方法一定是依附于一个对象,将函数赋值给对象的一个属性,那么就成为了方法
function f(){ this.method=function(){} } var f={ method:function(){} }
this的含义:这个依附的对象
注:arguments 这种伪数组, 或者 [] 数组这样的对象中, 这样调用函数也是方法调用, this 会只指向对象
arguments
对象不是一个Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array
属性。例如,它没有pop 方法。但是它可以被转换为一个真正的Array
var args=Array.prototype.slice.call(arguments); var args=[].slice.call(arguments); // ES2015 const args=Array.form(arguments); const args=[...arguments];
构造器模式(构造函数模式,构造方法模式)
- 使用 new 引导构造函数, 创建了一个实例对象
- 在创建对象的同时, 将this指向这个刚刚创建的对象
- 在构造函数中, 不需要 return , 会默认的 return this
关于return的补充:
在构造函数中,普通情况,可以理解为构造函数已经默认进行了return this,添加在后面的都不会执行
如果手动的添加 return ,就相当于 return this.
如果手动的添加 return 基本类型(字符串, 数字, 布尔), 无效, 还是 return this
如果手动的添加 return null 或 return undefined, 无效, 还是 return this
特殊情况, return对象, 最终返回对象
手动添加return对象类型,那么原来创建的this会被丢掉,返回 return 后面的对象
上下文调用模式
上下文调用模式也叫方法借用模式,分为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。