1。问题引入functionA(){}A.prototype.fna=function(){console.log(this);}我的问题是fna的this指向哪里?vara=newA();a.fna();//A{}varfnt=a.fna;fnt();//window{...}看看我们经常遇到的情况functionA(){this.name='A';}A.prototype.fna=function(){returnthis.name;}functionsayName(fn){console.log(fn());}vara=newA();说名字(a.fna);//undefinedsayName(a.fna.bind(a));//A这里就是为什么我们在写代码的时候一般都会调用bind函数绑定上下文functionA(){this.fna=function(){console.log(this);}}A.prototype.getFna=function(){returnthis.fna;}functionsayContext(fn){fn();}vara=newA();varfna=a.getFna();sayContext(fna);//为什么window会出现上面的情况在java中,this总是指向调用对象。是的,它总是指向调用对象,调用对象,这个很重要,java的static成员没有this的概念。在javascript中这只与函数的执行环境有关。只有三种情况。在严格模式下browser、window、callobject、undefined,我们开发者都可以接触到以上三个,所以我们可以理解为函数的执行环境就是以上三个。2.确定this的方向我们如何确定this的方向呢?介绍这个确定方向的文章很多,方法也很多。我是根据函数的调用情况来判断的。有以下两个判断标准。1如果函数的最终调用形式是fn();那么this在非严格模式下指向window对象,在严格模式下指向undefined。2如果对象调用了o.fn();thisform指向对象oYes这两个标准就是这么简单。3.通过call,apply,bind深入理解this函数调用原型,...]]])以上三个函数是用来改变函数1调用的this点第一个参数是期望点的fn中的this,取值可以是object也可以是undefined,后面要传参数fn的参数列表2apply第一个参数是this在fn中的期望点,取值可以是object或undefined,下面的值为fn的参数,是一个数组。call和apply的功能是一样的,唯一不同的是参数selected可以作为参数列表传入,也可以作为数组传入,可以交替使用。调用者的两个函数都会立即执行fn,这里是立即执行3bind第一个参数是this在fn中的期望点,值可以是对象也可以是undefined,后面的参数是要传递给的参数列表fn。调用bind函数会返回一个函数,这个函数是对fn的包装,和fn唯一的区别就是this是绑定的,也就是this指向一个明确的。所以bind、call、apply的区别在于,bind返回的是一个明确this的新函数,而call和apply立即执行fn。在这一点上,我觉得javascript的this已经说的很清楚了。
