@GivenCui
2016-05-25T11:14:26.000000Z
字数 2229
阅读 821
js高级
在JS中,所有函数都运行在某个运行环境中,对于JS而言,一切皆对象,运行环境也是对象,所以函数中的this关键字的指向,也是根据当前对象(运行环境)而定的.
// this关键字的举例// 在构造函数中,this指向的就是该构造函数所创建的实例对象.function Person () {this.name = "abc";}var person1 = new Person();person1.name = "bcd";console.log(person1.name); // bcdvar person2 = new Person();console.log(person2.name); // abc// this自动找到实例对象的指针,可以理解为已经关联好了
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>强大的this</title><script type = "text/javascript">// this在这种运行环境中,就代表当前点击的按钮对象function btnClick (ele){alert(ele.value); // 谁点就指向谁}</script></head><body><input type = "button" value = "这是一个按钮" onclick="btnClick(this);" /><input type = "button" value = "这是另一个按钮" onclick="btnClick(this);" /></body></html>
在JS中,因为JS是动态脚本语言,运行环境是动态切换的,即this关键字的指向也是跟着动态切换的.
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>this随环境动态切换</title></head><body><script type = "text/javascript">function fn () {console.log(this.name)}// 创建一个字面量对象 ( JSON )var a = {name : "a",aFn : fn // 是个对象}// 再创建一个字面量函数var b = {name : "b";bFn : fn // 是个对象,也指向fn}// 提现了根据环境动态切换a.aFn(); // ab.bFn(); // b</script></body></html>
全局环境中this指向的是最顶端的window对象
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><script type = "text/javascript">// 1. this的全局环境指向windowconsole.log(this === window); // true</script></head><body></body></html>
构造函数中this指向的是该构造函数所创建的实例对象
// this在构造函数中function(){this.name = "张飞";}Person.prototype.say = function () {console.log (this.name);}// 创建一个实例var person = new Person();person.say(); // 张飞
如果某个对象的方法指向了另外一个对象的某个方法,那么方法内部的this指向也会发生变化.
// 对象方法中// 用字面量方式创建的对象// a有name属性和aFn方法var a = {name : "a",aFn : function () {alert(this.name)// alert(a.name) // 字面量可以这么写}}var b = {name : "b",// 为什么是b呢????// bFn : a.aFn 是取了地址指向了b所以b调用// 如何改成 bFn : a.aFn()// 是指把a.aFn()的返回值给了bFn;// 有函数()就是调用的函数/*bFn : a.aFn // b*//*bFn : function () {a.aFn() // a}*/}
如果某个对象的层次机构很深,我们想把某个方法提取出来,不要直接去提取方法,而是提取方法所在的对象.
// json的多层嵌套// c对象中有d对象var c = {d : {name : "刘a",fn : function () {console.log(this.name);console.log(this === window);}}}// 提取fn函数,目的为了简化开发/*// 提取出来了(这么提取不对)var myfn = c.d.fn; // myfn是个全局变量,存的只是地址// 这么提取的话,函数内部的this指向变成了window对象// 因为myfn是一个全局变量myfn(); // undefined true*/// 正确的提取方法// 如果想把fn函数提取出来,而且this指针不改变的话,那么就提取fn函数所在的对象var myObj = c.d; // myObj是个对象myObj.fn1(); // 刘