this(函数的 上下文对象)
函数在执行时,浏览器每次都会传递进两个隐含的参数this 和 arguments,这个参数是 函数的 上下文对象,我们可以通过this来使用该对象。this 本身不具有含义
- 根据函数调用方式的不同,this的值也不同
1.以函数的形式调用时,this永远都是window
2.以方法的形式调用时,this是调用方法的对象
- this 的指代的不同含义:
1,this 在事件处理的函数中 ,指代 获取触发当前事件的元素
2,this 在普通函数中 , 指代 window 对象
3,this 在全局域中, 指代 window 对象
4,this 在构造函数中, 指代 创建的对象
5,this 在对象中, 指代 当前的对象
6, 以call()和apply()调用时,this是方法中的第一个参数
this指代的含义(绑定规则另一种理解):
独立函数调用。可以把这条规则看作是无法应用其他规则时的默认规则
- 独立函数调用,如果使用了非严格模式,this 会绑定到全局对象(window)
独立函数调用,如果使用严格模式( strict mode ),this 会绑定到 undefine
无论函数是在哪个作用域中被调用,只要是独立调用则就会按默认绑定规则被绑定到全局对象或者undefined上
- 隐式绑定的规则是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含。当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象
- 对象属性引用链中只有最顶层或者说最后一层会影响调用位置
//就是最顶层或是最后一层会影响调用位置,这里指的是obj2
obj1.obj2.fun();
- 对象属性引用链中只有最顶层或者说最后一层会影响调用位置
绑定规则
- 默认绑定
this==>winow对象 - 隐式绑定
1. this==>函数引用的上下文对象
2. 隐式丢失:发生引用传递时会有隐式丢失的情况(引用赋值,参数传递会发生隐式丢失)
- 隐式丢失解决方案
使用硬绑定(一种显示绑定的形式)
- 隐式丢失解决方案
- 显示绑定
this==>我们指定的对象 - new绑定
this==>实例对象
优先级
new绑定 > 显示绑定 > 隐式绑定 > 默认绑定
正常情况下的规则
- 函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。
var bar = new fun() - 函数是否通过call、apply(显式绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象。
var bar = fun.call(obj2) - 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。
var bar = obj1.fun() - 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。
var bar = fun()
绑定例外
在某些场景下this的绑定行为会出乎意料,你认为应当应用其他绑定规则时,实际上应用的可能 是默认绑定规则
柯里化
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。(预定义一些参数)
例外
如果你把 null 或者 undefined 作为 this 的绑定对象传入 call 、 apply 或者 bind ,这些值在调用时会被忽略,实际应用的是默认绑定规则
function foo() {
console.log( this.a ); // 2
}
var a = 2;
foo.call( null );
使用工厂方法来创建对象
function createPerson(形参)
{
var obj = new Object(); //创建一个新的对象
obj.name = name; //向对象中添加属性
return obj; //将对象作为返回值返回
}
- arguments 只出现在函数体内,在函数外面是找不到
- arguments是一个类数组对象,在这个对象中封装了函数调用时的实参
- 所有的实参都在arguments中保存,即使不定义形参也可以通过arguments来获取实参,无论形参有没有,他只获取得实参,他获取所有的实参。
它调用的方法是:arguments[数值]
- 属性:length 表示arguments中实参的长度
在JavaScript中没有函数多载,常利用这种方法实现函数重载的效果:定义多个相同名字的函数,根据需求运行对应的函数。 - undefined 加其他任何类型的值,结果都是undefined
- 属性:length 表示arguments中实参的长度