首页 > javascript嵌套函数作为方法调用

javascript嵌套函数作为方法调用

黄字部分如何理解?

截图来自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的指向可以通过callapplybind改变,举个粟子:

var per = {
  name: '不写代码的码农',
  getName: function(){
    console.log(this.name);
  }
}
var per2 = {
  name: 'pomy'
}
per.getName.call(per2);  //'pomy'
per.getName();           //'不写代码的码农'        

通过call就显示的改变的this的指向。

如果有nested functionthis的指向又会不同,举个粟子:

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方法也可以的

【热门文章】
【热门文章】