黄字部分如何理解?
截图来自javascript权威指南,这本书里所讲的方法特指对象中的函数。
函数的的调用方式也有几种:
方法调用 o.m();
函数调用 f();
....
那么嵌套函数或者说内部函数,如何实现方法调用?
有不止一种方法可以将嵌套函数作为方法调用。例如使用call或apply:
f.call(o);
这句相当于在o对象上调用f方法。
另外一种方法是将函数设置为某个对象的属性,使其成为该对象的方法,例如:
var o = {};
function outer() {
var inner = function() {
console.log(this === o);
};
o.m = inner;
}
outer();
o.m(); // print "true"
在JavaScript中,this
不仅跟上下文有关,还跟它所在环境的调用方式有关。
跟上下文的关系
看这样一段代码
var name = 'pomy';
console.log(this.name); //'pomy',this指向window
var per = {
name: '不写代码的码农',
getName: function(){
console.log(this.name);
}
}
per.getName(); //'不写代码的码农' this指向调用getName的对象
跟环境的调用方式
在JavaScript中,this
的指向可以通过call
、apply
和bind
改变,举个粟子:
var per = {
name: '不写代码的码农',
getName: function(){
console.log(this.name);
}
}
var per2 = {
name: 'pomy'
}
per.getName.call(per2); //'pomy'
per.getName(); //'不写代码的码农'
通过call
就显示的改变的this
的指向。
如果有nested function
,this
的指向又会不同,举个粟子:
var test = {
id: 'nested function',
getName: function(){
console.log(this.id); //this指向 test对象,输出'nested function'
var dom = document.getElementById('test');
dom.click(function(){
console.log(this.id); //this指向dom,输出dom的id
})
}
}
关于this
指向的总结,可以看这篇文章:JavaScript面试问题:事件委托和this
理解函数中的this不是在定义的时候决定的,其是在运行解释的过程中以调用方法的不同而决定的这个是关键
方法调用就是作为一个对象的函数属性调用
o.f();//方法调用
var t=o.f;
t();//函数调用
也可以通过
call/apply方法手工的改变函数this的指向
bind方法也可以的