【问题标题】:How to use the "this" keyword to call a如何使用“this”关键字调用
【发布时间】:2012-08-10 17:33:37
【问题描述】:

如何在 JavaScript 中编写一个接收数组和函数的函数(convertFunc)。该函数为数组的每个元素调用 convertFunc。 该元素应通过 this 关键字访问。 该函数应该返回一个由 convertFunc 调用的返回值组成的数组吗? 例如

function(array, convertFunc() {  // array=[1,2,3]
    return this+10;
} 

应该返回 [11,12,13]

谢谢

【问题讨论】:

标签: javascript arrays function this


【解决方案1】:
  1. 创建函数,例如function map(arr, convertFunc) {
  2. 遍历数组arr的所有元素。
  3. 提示:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call
  4. 返回一个数组,其中包含函数调用的所有结果。
  5. }

你自己弄清楚具体细节,祝你好运:)

【讨论】:

  • 这是解决实际问题的唯一答案:创建一个接收数组和函数作为参数的函数。
【解决方案2】:

array.map(callback[, thisObject]); 可能适合你。

例子:

var nums = [1,2,3];

function FuncName(x)
{
    return x+10;
}

var result = nums.map(FuncName); //[11,12,13]

【讨论】:

    【解决方案3】:

    如果您正在寻找扩展 Array 对象,请尝试此操作

    Array.prototype.convertFunc = function() {
    
    var arr = this, i; // As you want array is access using the this keyword.
    
    for(i = 0; i<arr.length; i++)
    {
        arr[i] = arr[i] + 10;
    }
    
    return arr;
    }
    
    var myArray = [1,2,3];
    
    
     // Call like this
     myArray.convertFunc();
    

    在这里提琴http://jsfiddle.net/PYxzj/

    更新

    要回答你的问题,试试这个

        // Pass your array and a function as parameter
    function arrayModify(array, convertFunc)
    {
      return array.convertFunc();
    }
    
    
    // This function iterates your array and adds 10 to each element.
    var arrayAddFunction = function() {
    
       var arr = this, i;
       for(i = 0; i<arr.length; i++)
       {
          arr[i] = arr[i] + 10;
       }
    
    return arr;
    }
    
    // Extending the array object
    Array.prototype.convertFunc = arrayAddFunction;
    
    var aa = [1,2,3];
    
    // As you want send your array and a function as parameters to another function 
    alert(arrayModify(aa,arrayAddFunction)); // -> [11, 12, 13]
    

    在这里拉小提琴http://jsfiddle.net/qzB4e/

    【讨论】:

    • 我假设是因为它没有回答问题。您没有解释如何创建一个函数,该函数接受一个数组和一个回调并为每个数组元素执行回调。您的解决方案较差...
    • 这可行,但不必要地复杂和混乱。你传递给arrayModify 的函数什么都不做。它“看起来”像参数convertFuncreturn array.convertFunc(); 中的名称convertFunc 在某种程度上相关,但它们根本不相关。对不起,但这只是一个巨大的混乱。在这里扩展数组原型是错误的方式。
    • @kiranvj,修改原生对象原型通常被认为是不好的做法。
    • 是的,我也觉得代码有点乱。我应该删除它吗?还是对任何人都有用?
    【解决方案4】:
    var myFunc = function(fn) {  // array=[1,2,3]
        return fn(this);
    };
    
    myFunc.call(arr,function convertFunc(){
        return this+10;
    });
    

    但是,要解决您的确切问题:

    var arr = [1,2,3], addTen = function(){
        for (var l=this.length;l--;) this[l] += 10;
    };
    
    addTen.call(arr);
    

    【讨论】:

    • 我建议不要对原生 Array 对象进行原型设计......但是,它也很有效(正如另一个答案所暗示的那样)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2015-02-17
    • 2017-04-19
    相关资源
    最近更新 更多