对JavaScript中this指针的新理解分享_javascript技巧
下面我们一起来看看这个this吧。
在我们声明一个函数时,每个函数除了有定义时的parameters(形参),自身还会有额外的两个参数,一个是this,一个是arguments(实参)。arguments就是函数实际接受到的参数,是一个类数组。arguments我只做个简略的介绍,重点我们放在this指针上。
在面向对象变成中,this十分重要,它的值取决于调用的模式。而在JavaScript中,一共有4中调用模式:方法调用模式、函数调用模式、构造函数调用模式、apply调用模式。
方法调用模式
当一个函数是作为一个对象的属性时,我们通常称这个函数是这个对象的一个方法。当这个方法被调用时,this就会指向该方法所属对象。
如栗子所示,this指向了sayName对象,这种通过this取得所属对象上下文的方法,就是公共方法。(publice method)
函数调用模式
当一个函数被调用时并非某个对象上的方法,那么它就是作为一个函数被调用的。
这种模式调用,this会指向window对象,即使这个函数或许是在外部函数里调用的,我们来看栗子。
这样一看,是不是大概知道该怎么解决JavaScript这个“设计错误"了呢。
是的只要在student函数里面,也就是第6行,将this缓存起来。然后再将this通过变量转移到sayName函数里就可以解决啦!
var people = {
name : "people-Yika",
student : function(){
var self = this; //将this缓存起来
function sayName(){
var name = "sayName-Yika";
console.log(self.name); //"people-Yika",此时的self指向的是people对象
};
sayName();
}
}
构造函数调用模式
JavaScript里一讲到构造函数,脑海里就会有:“函数名大写!调用的时候要用new操作符!” 函数名大写好理解,是为了规范统一构造函数的命名。可是你有没有深究过为什么要用new呢?如果在一个函数前面带上new来调用,那么函数后台会创建一个指向该函数prototype的新对象,同时this也绑定在新对象上。JavaScript是一门基于原型继承的语言,对原型prototype不是很清楚的同学可以自己去查一下资料,我重点放在this上面。
我们先来看看构造函数一般长什么样子。
乍一看,好像不是好懂,怎么刚才在函数里的this是指向window,现在不用缓存就可以指向People函数呢?
没关系,刚才不是说函数通过new调用,会在背地里自己做“做坏事”么,我们一起看看到底做了哪些事。
这样看就明白清楚了吧,new不仅会生成一个对象,而且还会自动return这个对象,这样自然this便指向了这个新对象。
千万记得要用 new 去调用构造函数,不然出了问题,是没有警告的,所有大写约定还是十分有必要的。
Apply调用模式
apply方法让我们构建一个参数数组传递给调用函数,也允许我们改变this值。
function.apply(this绑定的值, arguments参数数组)
apply可以说的东西太多了,我这里只举个的栗子来帮助大家理解:
我们可以通过apply轻易的修改函数的this绑定对象,和apply相似的方法call也有一样的效果,有兴趣的同学可以自己搜索学习一下。
好了,总算讲完改变this的四种调用模式了,方法调用模式和构造函数调用模式会用的更多,也会更重要一点,而函数调用模式,我们则要学会避开其中的陷阱。
若有错误,请及时反映,我会尽快纠正,以防误导他人,谢谢!
推荐阅读
-
JavaScript开发中14个有用的Jquery技巧分享
-
工作中遇到的HTML和CSS布局和JavaScript技巧记录分享
-
对javascript中浅拷贝和深拷贝以及赋值的理解
-
JavaScript中this指针指向的彻底理解
-
JavaScript开发中14个有用的Jquery技巧分享
-
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容_javascript技巧
-
JavaScript中关于console.log调试的技巧分享
-
小议Javascript中的this指针_javascript技巧
-
理解JavaScript中的对象 推荐_javascript技巧
-
理解JavaScript中的对象 推荐_javascript技巧