我可以制作本地"这个"在另一个功能内可用?

时间:2014-07-13 08:26:58

标签: javascript

我有这个函数编码:

var Dom = function () {

    this.getX = function (element, value) {
        ... 
    }

    this.checkX = function (label, expectedCount, params) {
        it(label + ': Check for ' + expectedCount, function () {
            for (var i = 0; i < params.length; ++i) {
                this.getX.apply(this, params[i]).click();
            }
        });
    }

它给了我一个未定义的getX。我如何才能使getX在checkX函数中工作?

3 个答案:

答案 0 :(得分:1)

有几种方法可以更改this在函数中引用的内容,或以其他方式保留对外部this的访问权限。但是,我们应该注意到您的问题不在checkX,而在 checkX中使用匿名函数,因此您需要将其中一种技术应用于该函数。< / p>

在变量中存储对this的引用:

var Dom = function() {
    var self = this;

    this.getX = function(element, value) {
        ...
    }

    this.checkX = function (label, expectedCount, params) {
        it(label + ': Check for ' + expectedCount, function () {
            for (var i = 0; i < params.length; ++i) {
                self.getX.apply(self, params[i]).click();
            }
        });
    }
}

或者使用Function.prototype.bind(感谢elclanrs在评论中提到这一点):

var Dom = function() {
    this.getX = function(element, value) {
        ...
    };

    this.checkX = function (label, expectedCount, params) {
        it(label + ': Check for ' + expectedCount, (function () {
            for (var i = 0; i < params.length; ++i) {
                this.getX.apply(this, params[i]).click();
            }
        }).bind(this));
    }
}

..或者,使用Function.prototype.call。这种技术在您的场景中不起作用,因为您无法控制何时调用匿名函数,但一般情况下知道它很有用。

var Dom = function() {
    this.getX = function(element, value) {
        ...
    };

    this.checkX = function (label, expectedCount, params) {
        ...
    }

    // when calling checkX later..
    this.checkX.call(this, argument1, argument2, argument3);
}

许多JavaScript库包含可以轻松处理this引用的实用程序的实用程序,因为回调函数在大多数JS应用程序中都非常常见。例如,请参阅dojo.hitch或jQuery&#39; $.proxy。您可以轻松编写自己的函数来执行相同的操作:

function WrapCallbackWithContext(context, callback) {
    return function() {
        return callback.apply(context, arguments);
    }
}

答案 1 :(得分:1)

尝试将范围保留在另一个变量中:

var Dom = function () {
    var self = this;
    this.getX = function ( element, value ) {
        ... 
    }

    this.checkX = function ( label, expectedCount, params ) {
        ...
        self.getX.apply( self, params[ i ] ).click();
        ... 
    }
}

var self = this;会在DOM变量中保留self函数的范围。当您进入其中一个内部函数时,您仍然可以访问self变量,因此仍然可以访问原始范围。

答案 2 :(得分:-1)

您的it函数似乎正在调用callback函数,callback this内部不会引用您的外部函数

var Dom = function () {

    this.getX = function (element, value) {
        ... 
    }
    var _this = this;
    this.checkX = function (label, expectedCount, params) {
        it(label + ': Check for ' + expectedCount, function () {
            for (var i = 0; i < params.length; ++i) {
                _this.getX.apply(this, params[i]).click();
            }
        });
    }
}