我有这个函数编码:
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函数中工作?
答案 0 :(得分:1)
有几种方法可以更改 在变量中存储对 或者使用Function.prototype.bind(感谢elclanrs在评论中提到这一点): ..或者,使用Function.prototype.call。这种技术在您的场景中不起作用,因为您无法控制何时调用匿名函数,但一般情况下知道它很有用。 许多JavaScript库包含可以轻松处理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();
}
});
}
}
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));
}
}
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);
}
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();
}
});
}
}