本文章引用《你所不知道的Javascript》
重点:this既不指向函数自身也不指向函数的词法作用域=》调用时被绑定,指向谁完全取决于在哪里调用。
词法作用域:在我看来就是我们常用的全局变量
eg:
function foo(num){console.log("foo:"+num); data.count++} var data = {count:0};var i;
for(i=0;i<10;i++){if(i<5){foo(i);}} console.log(data.count)
运行结果:
foo:0、foo:1、foo:2、foo:3、 foo:4 5
同样为了减少变量,完全使用foo本身作为词法作用域
function foo(num){console.log("foo:"+num); foo.count++}
foo.count=0;
var i;for(i=0;i<10;i++){if(i<5){foo(i);}}
console.log(foo.count);
运行结果:同上。
但是为啥我们要用这些方式呢,因为不理解this.
所以this是啥?
以上方法又该如何用this.其实很简单。在调用时指定
function foo(num){console.log("foo:"+num); this.count++} foo.count=0;var i;for(i=0;i<10;i++){if(i<5){foo.call(foo,i);}}console.log(foo.count)
运行结果:同上。
重点:this不可以与词法作用域混合使用。无法实现
以上只是阐述了一个和词法作用域相关的函数调用
那么下面为什么一定要用this?
function identify(){return this.name.toUpperCase()}
function speak(){var greeting="Hello,I'm"+identify.call(this);console.log(greeting)}
var me = {name:"xiaohua"}; var you={name:"Reader"};
identify.call(me);
speak.call(me);
运行结果:宝宝们自己执行吧
那我们显式的写,有哪些坏处?
会使得代码很混乱。
通过原型,可以自动调用上下文,简洁而方便。
当然除了这些,还有es6里箭头函数的引用。这个部分下次再说