這個系列的教程我一開始是寫在github上的,
可是以爲放到掘金來可讓更多須要的人看到,
就搬到掘金專欄上啦,
若是以爲本教程對你有幫助,請點這裏去github上給我一顆Star~
教程目錄也在github上哈~javascript
閒話說太多了~下面開始第一篇:java
在看他人寫的js文件時,會看到許多this,
對this不熟悉的人很容易蒙圈,這裏就說明如何用最簡單的方法去找this指向誰。git
function foo(){
console.log(this)
}複製代碼
foo(); //本身去運行代碼看this指向誰
//腦補:
window.foo(); //本身去運行代碼看this指向誰複製代碼
不用懷疑,也不用猶豫,找不到任何「.」,this指向window。
之後見到直接調用的foo,自動腦補成window.foo(),由於在這種狀況下,這兩種寫法是同樣的。複製代碼
function foo(callback){
callback(); //調用其實在這裏,你是找不到「.」的
}
foo(function(){
console.log(this); //本身去運行代碼看this指向誰
})複製代碼
這個例子就是,匿名函數內部打印了this,它做爲參數,內部的this指向window。複製代碼
var bar = {name:'我是bar'};
bar.foo = function(){
console.log(this)
};複製代碼
bar.foo(); //本身去運行代碼看this指向誰複製代碼
這個例子,咱們找到了「.」的存在,「.」左側是bar,指向是bar。複製代碼
var obj = {name:'我是obj'};
obj.bar = {name:'我是bar'};
obj.bar.foo = function(){
console.log(this)
};複製代碼
obj.bar.foo(); //本身去運行代碼看this指向誰複製代碼
這個例子,咱們找到了倆「.」,最後一個「.」左側的對象是bar,那麼this指向就是bar。複製代碼
對面向對象不夠了解的同窗,請儘可能讀懂不得不提的原型/原型鏈
閱讀本文,就先專一於找this指向吧!github
function Foo(){
this.name = 'hahaha'
console.log(this);
}
Foo.prototype.bar = function(){
console.log(this);
}
Foo.prototype.funcWithParam = function(fn){
fn();
}複製代碼
Foo(); //本身去運行代碼看this指向誰
Foo.prototype.bar(); //本身去運行代碼看this指向誰
var foo = new Foo(); //本身去運行代碼看this指向誰
foo.name = '我是foo';
foo.bar(); //本身去運行代碼看this指向誰
foo.funcWithParam(function(){
console.log(this); //本身去運行代碼看this指向誰
});複製代碼
當Foo()時,Foo被當作[普通函數],那麼遵循找「點」大法,Foo內部的this是指向window的;
當Foo.prototype.bar()時,Foo仍是被當作[普通函數],遵循找「點」大法,按照2-2,發現找到了prototype,轉而遵循㈡,再向左找,發現this指向Foo;
當new Foo()時,Foo做爲[構造函數]被實例化,Foo內部的this指向實例化後的Foo,也就是我聲明的foo;
當foo.bar時,遵循找「點」大法,按照2-1,發現this指向foo;
當foo.funcWithParam(匿名函數)時,匿名函數前沒有「.」,匿名函數做爲參數,因此遵循㈠,發現其內部this指向window;複製代碼
PS:
歡迎轉載,須要註明原址。
教程之間緊密聯繫,不懂的地方,請好好看下全系列教程目錄,
有沒有你不懂的那個關鍵字在裏面。
若是幫到你,別忘了給我一顆Star~
app