foo2那个调用的是局部变量啊,后面那个你要搞清楚调用callback函数的是谁,是window吧,骚年

解决方案 »

  1.   

    var bar = foo(function(){ alert([this.x,x])}); ==function foo(f) {
           var oo = f;
       var x = 'foo';
       return oo;
    };
    f在x前面。
    fff.method2(ff.say) 这样看就清楚。
    var $a = ff.say;
    var $x = $a('method');
      

  2.   

    嗯。谢谢LS的。自己通过调试器还是想清楚了。第一个问题foo2其实产生了闭包~所以先引用本AO.name.
    第2个问题就是如LS说的那样!!我刚开始弄混了。callback = ff.say;
    callback(),ff.say().其实callback就是一个匿名函数~匿名函数调用的this当然指向window~。
      

  3.   

    this都是指window
    方法里的this要是不想指向window就得用function.call(_this)来调用
      

  4.   

    (1)bar和bar2的作用域链不同!
    foo返回的函数即变量bar是在全局中定义的 是个全局函数: bar在弹出x时 先在自身函数内找,结果找不到然后接着就往全局找,结果在全局找到x即字符串“global”。
    foo2返回的函数即bar2是在foo2内定义的,是局部函数:bar2在弹出x时  同样先在函数本身内找,没有找到后再在foo2内找,如果在foo2内找不到的话会继续向上在全局里找,但是在foo2中找到了x(‘foo2’),所以立即弹出不再向上查找。(2)先说“fff.method2(function(greet){return this.name + ' and ' + greet;})])”:
    这个函数(红色部分)和上面的bar一样是在全局定义的,是个全局函数,只要是全局函数,那么函数中的this就会指向window。再说“fff.method2(ff.say)”:
    函数中的this指向取决于它是如何被调用的,一定要注意“调用”这两个字。
    “ff.say()”这叫做调用,此时say函数作为ff的方法调用,this当然是指向ff,也就会弹出“ff”。
    但是在“fff.method2(ff.say)”中不是ff.say()而是“ff.say”。
    ff.say是调用吗?不是!它只是一个函数,而且它最终传入fff.method中以callback的身份被调用(callback('method')),而不是像“ff.say()”一样作为ff的方法被调用,对于对象方法而言如果作为对象方法调用那么它的this就会指向window(同上,因为它是在全局定义的),所以最终ff.say这个函数再最终调用时this指向了window。楼主可以google一下作用域的相关知识~~~ps:码字也挺辛苦的~~顿时觉得这分儿少了点~~~