工做有那么一段时间了,可是在工做中,发现本身的理论知识仍是有所欠缺。特别是在javascript上,不少东西其实本身属于知道要用这个,可是不知道为何要这么用...这种状况非常尴尬了,因此写博客的很重要一个目的就是锻炼我本身的总结能力,把学到的东西总结出来,感受这样能让我更快的去理解所学到的东西。javascript
刚开始作前端的时候仍是以完成功能为主,因此忽略掉了理论知识的重要性,可是随着工做的慢慢深刻,发现不少原理仍是要创建在对理论知识的理解与掌握上。前端
做为一个合格的前端工程师,这个确实有点不能忍...因此仍是要沉下心来,一点点的去提高本身。话说回来,其实javascript的理论在我看来并无那么的枯燥难懂,可是须要你去实验、去调试。兴趣永远是学习最好的动力,我想保持这份兴趣,持续的去研究javascript的理论,去探寻其中的秘密和让人惊叹的地方。java
闲话扯了那么多,但愿各位看官不要在乎...只是本人一点点心声罢了...言归正传,关于this,其实在我看来确实算是javascript中很基础、很重要、也是很难理解的一个点;数组
this的定义,借助下阮一峰大大的总结,感受比较好理解些:浏览器
function test(){ this.x = 1; }
其实this之因此难以理解,主要就是在不一样状况下,this的指向都是不同的。如下几种状况,基本概括了常见的this的指向:前端工程师
console.log(this);//输出window function foo(){ console.log(this); } foo();//输出window
var obj = {name:'test'}; function foo(){ console.log(this); } foo.call(obj);//输出obj foo.apply(obj);//输出obj
var arr1 = [1, 2 , 3], arr2 = [4, 5, 6]; Array.prototype.push.apply(arr1, arr2); console.log(arr1);//输出[1, 2, 3, 4, 5, 6]
var obj = {name:'test'}; function foo(){ console.log(this); } obj.foo = foo; obj.foo();//输出obj
function C(){ this.name = 'test'; this.age = 18; console.log(this); } var c = new C();//输出 c console.log(c);//输出 c
上述四种状况基本概述了this的常见指向,可是也有些特殊的状况下,this的指向并不在上诉的范围中:app
这个方法会建立一个函数实例,其this值会被绑定到传给bind()函数的值。也就是说会返回一个新函数,而且使函数内部的this指向为传入的第一个参数:函数
window.color = 'red'; var o = {color : 'blue'}; function sayColor(){ alert(this.color) } var objectSayColor = sayColor.bind(o); objectSayColor();//blue
b.eval学习
对于eval函数,其执行时候彷佛没有指定当前对象,但实际上其this并不是指向window,由于该函数执行时的做用域是当前做用域,即等同于在该行将里面的代码填进去。下面的例子说明了这个问题:this
var name = "window"; var Bob = { name: "Bob", showName: function(){ eval("alert(this.name)"); } }; Bob.showName();
其实除去上面的特殊状况,咱们只要记住这四种状况,那么对于this的指向应该就有一个较为清楚的认识。
博文中若有叙述不清或者错误,欢迎各位批评指正!完结撒花~