如何获得调用函数的'this'值?

时间:2011-06-13 14:46:48

标签: javascript function scope this

如果我有这样的功能:

function foo(_this) {
    console.log(_this);
}

function bar() {}
bar.prototype.func = function() {
    foo(this);
}

var test = new bar();
test.func();

然后记录test的{​​{1}}实例。

但是,要实现此目的,我必须在bar函数中传递this。我想知道是否有可能在没有传递bar.prototype.func的情况下获得相同的this

我尝试使用this,但这会返回原型函数本身,而不是原型函数中的arguments.callee.caller值。

是否可以通过仅在原型函数中调用this来记录test bar实例?

4 个答案:

答案 0 :(得分:4)

如果问题是“没有通过此(以任何方式)”,那么答案是

值可以通过替代方法传递。例如,使用全局变量(在Bar类中)或会话或cookie。

    function bar() {

      var myThis;

      function foo() {
          console.log(myThis);
      }

      bar.prototype.func = function() {

          myThis = this;
           foo();
      }
   }

   var test = new bar();
   test.func();

答案 1 :(得分:1)

我认为在foo的上下文中调用bar应该有效:

function foo() {
    console.log(this.testVal);
}

function bar() { this.testVal = 'From bar with love'; }
bar.prototype.func = function() {
    foo.call(this);
}

var test = new bar();
test.func(); //=> 'From bar with love'

答案 2 :(得分:1)

这个怎么样?

"use strict";
var o = {
    foo : function() {
        console.log(this);
    }
}

function bar() {}
bar.prototype = o;
bar.prototype.constructor = bar;
bar.prototype.func = function() {
    this.foo();
}

var test = new bar();
test.func();

或者这个:

"use strict";
Function.prototype.extender = function( o ){
    if(typeof o ==  'object'){
        this.prototype = o;
    }else if ( typeof o ==  'function' ) {
        this.prototype = Object.create(o.prototype);
    }else{
        throw Error('Error while extending '+this.name);
    }
    this.prototype.constructor = this;
}
var o = {
    foo : function() {
        console.log(this);
    }
}

function bar() {}
bar.extender(o);
bar.prototype.func = function() {
    this.foo();
}

var test = new bar();
test.func();

答案 3 :(得分:0)

您可以在不更改外部功能的情况下执行此操作,但必须更改调用方式。

您无法获取调用者的上下文,但您可以使用方法applycall在您调用的函数上设置this属性。有关this的解释,请参阅this reference

function foo()
{
    console.log( this );
}

function bar()
{
    bar.prototype.func = function func() 
    {
        foo.apply( this );
    };
}

var test = new bar();
test.func();

通常使用this时,它位于面向对象的上下文中。试图用另一个方法调用对象的方法可能表明设计不佳。为更适用的设计模式解释一下你想要实现的目标。

有关javascript OOP范例的示例,请检查my answer here