我可以制作本地的“this”吗?在另一个函数中可用

Can I make the local "this" available inside another function?

本文关键字:另一个 函数 this 我可以      更新时间:2023-09-26

我有这个函数编码:

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函数内工作?

有几种方法可以改变this在函数中的引用,或者保留对外部this的访问权。然而,我们应该注意到您的问题不在于checkX,而在于 checkX中的匿名函数,因此您需要将这些技术之一应用于该函数。

在变量中存储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(感谢elclrs在评论中提到这一点):

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的$.proxy。您可以轻松地编写自己的函数来做同样的事情:

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

尝试在不同的变量中保留作用域:

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;self变量中保留了DOM函数的作用域。当您进入一个内部函数时,您仍然可以访问self变量,因此仍然可以访问原始作用域。

似乎您的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();
            }
        });
    }
}