隐式丢失就是指隐式绑定的函数丢失绑定对象,从而默认绑定到全局或者undefined(取决于是否使用严格模式)
1、为函数调用创建别名
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
}
var bar=obj.foo;
var a="window";
bar()//window
虽然bar是obj.foo的一个引用,但是bar引用的是foo函数的本身,此时的bar()其实就是一个不带任何修饰的函数调用,所以应用了默认绑定,this为全局
2、传入回调函数
function foo(){
console.log(this.a);
}
function doFoo(fn){
fn();
}
var obj={
a:2,
foo:foo
}
var a="window";
doFoo(obj.foo)//window
参数传递其实就是隐式赋值。相当于var fn=obj.foo,与创建别名的结果一样,应用了默认绑定,应该注意的是,return返回一个函数时,也是应用了默认绑定
3、传入语言内置的函数
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
}
var a="window";
setTimeout(obj.foo,100)//window
在JavaScript内部,内置函数setTimeout函数实现可以看作
function setTimeout(fn,delay){
//等待delay毫秒
fn();
}
同样属于传参,应用默认绑定