this 隐式丢失

隐式丢失就是指隐式绑定的函数丢失绑定对象,从而默认绑定到全局或者undefined(取决于是否使用严格模式)

为函数调用创建别名

虽然bar是obj.foo的一个引用,但是bar引用的是foo函数的本身,此时的bar()其实就是一个不带任何修饰的函数调用,所以应用了默认绑定,this为全局

1
2
3
4
5
6
7
8
9
10
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
}
var bar = obj.foo;
var a = "window";
bar()//window

传入回调函数

参数传递其实就是隐式赋值。相当于var fn=obj.foo,与创建别名的结果一样,应用了默认绑定

1
2
3
4
5
6
7
8
9
10
11
12
function foo(){
console.log(this.a);
}
function doFoo(fn){
fn();
}
var obj={
a:2,
foo:foo
}
var a="window";
doFoo(obj.foo)//window

应该注意的是,return返回一个函数时,也是应用了默认绑定

1
2
3
4
5
6
7
8
9
10
var a = 100
function create() {
var a = 200
return function () {
console.log(a)
}
}
var fn = create();
fn()
// 200

传入语言内置的函数

1
2
3
4
5
6
7
8
9
function foo() {
console.log(this.a);
}
var obj = {
a:2,
foo:foo
}
var a = "window";
setTimeout(obj.foo, 100) //window

在JavaScript内部,内置函数setTimeout函数实现可以看作

1
2
3
4
function setTimeout(fn,delay){
//等待delay毫秒
fn();
}

同样属于传参,应用默认绑定