Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通行证;这";使用普通js no jquery运行的父上下文_Javascript_This - Fatal编程技术网

Javascript 通行证;这";使用普通js no jquery运行的父上下文

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'

我正在编写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','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]);
};