Javascript 通行证;这";使用普通js no jquery运行的父上下文
我正在编写helper函数来循环所有数组元素——只是为了学习js 代码如下:Javascript 通行证;这";使用普通js no jquery运行的父上下文,javascript,this,Javascript,This,我正在编写helper函数来循环所有数组元素——只是为了学习js 代码如下: function arrayLoop(array, func){ var ar = array.length, i=0; for ( i = 0; i < ar; i++ ){ func(i); }; }; 但当我尝试在对象内部执行此操作并希望使用此上下文时,会发生以下错误: function test(){ this.foo = ['aa'
function arrayLoop(array, func){
var ar = array.length,
i=0;
for ( i = 0; i < ar; i++ ){
func(i);
};
};
但当我尝试在对象内部执行此操作并希望使用此上下文时,会发生以下错误:
function test(){
this.foo = ['aa','bb','cc'];
this.bar = ['ff','gg','hh'];
}
test.prototype.find = function(){
arrayLoop(this.foo, function(i){
alert(this.bar[i]) //error- there is no this.bar
};
};
如何将父函数自动传递给ArrayLop函数???您可以在闭包中捕获它:
test.prototype.find = function() {
var self = this;
arrayLoop(this.foo, function(i) {
alert(self.bar[i]);
});
};
或使用以下功能:
test.prototype.find = function() {
arrayLoop(this.foo, function(i) {
alert(this.bar[i]);
}.bind(this));
};
将函数添加到对象:
test.prototype.find = function(){
arrayLoop(this.foo, function(i){
alert(this.bar[i]) //error- there is no this.bar
}.bind(this));
};
您可以更改ArrayLop以允许上下文参数:
function arrayLoop(array, ctx, func){
ctx = ctx || window;
var len = array.length, i = 0;
for ( i = 0; i < len; i++ ) {
func.call(ctx, i);
}
}
test.prototype.find = function(){
arrayLoop(this.foo, this, function(i) {
alert(this.bar[i]); // this will work
});
}
函数arrayLoop(数组、ctx、func){
ctx=ctx | |窗口;
var len=array.length,i=0;
对于(i=0;i
这允许您为回调传入所需的此值,然后在调用回调时为您设置该值,它将在所有浏览器中工作(.bind()
在较旧的浏览器中不工作)
仅供参考,您的find()
函数中还缺少了一个)
,并且您似乎喜欢一些额外的分号,这些分号不会造成伤害,但不需要在那里。使用方法
您可以找到代码不起作用的原因解释我知道这个解决方案,但有没有其他方法可以准确地使用“this”这个词?@kris-请参阅我使用this
的答案。是的,您可以使用.bind()
函数。我用一个例子更新了我的答案。
function arrayLoop(array, ctx, func){
ctx = ctx || window;
var len = array.length, i = 0;
for ( i = 0; i < len; i++ ) {
func.call(ctx, i);
}
}
test.prototype.find = function(){
arrayLoop(this.foo, this, function(i) {
alert(this.bar[i]); // this will work
});
}
test.prototype.find = function(){
arrayLoop(this.foo, method.bind(this));
}
test.prototype.method = function(i){
alert(this.bar[i]);
};