網上看到一句話,匿名函數的執行是具備全局性的,那怎麼具備的全局性呢?
this的指向在函數定義的時候是肯定不了的,只有函數執行的時候才能肯定this到底指向誰,實際上this的最終指向的是那個調用它的對象
1.案例中,第一個say打出來的是Alan,而第二個則是window
var name = 'window'
var person = {
name :'Alan',
sayOne:function () {
console.log(this.name)
},
sayTwo:function () {
return function () {
console.log(this.name)
}
}
}
person.sayOne()//Alan
person.sayTwo()() // window
2.緣由
- 函數內部的this指向調用者
- sayOne調用者是person對象,因此this指向person;
- sayTwo的調用者雖然也是person對象,可是區別在於此次調用並無打出this而是在全局返回了一個匿名函數
- 而這個匿名函數不是做爲某個對象的方法來調用執行,是在全局執行
3.咱們也能夠更改this指向,這裏應用JS高級編程的案例
var name = "global";
var foo = {
name: "foo",
getName : function(){
console.log(this.name);
}
}
var bar = {
name: "bar",
getName : function(){
return (function(){
console.log(this.name);
})();
}
}
foo.getName(); //foo
foo.getName.call(bar); //bar
foo.getName.call(this); //global
foo.getName.call(window); //global
(function(){
console.log(this.name)
}.bind(bar))(); //bar
(function(){
console.log(this.name)
}.bind())(); //global