这个系列的教程我一开始是写在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