附加到方法?代码理解

时间:2014-08-28 19:45:22

标签: angularjs javascript

在我想弄清楚的代码库中,我看到一个js文件(myloopfile.js)被导入到另一个js文件中。我试图弄清楚那里使用的一些代码

这是myloopfile.js

function method1(value) {
    // return something 
}

var myLooper = function (obj, iterator, context) {
    var key;
    if (obj) {
        if (typeof obj === 'function') {
            for (key in obj) {
                if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
                    iterator.call(context, obj[key], key);
                }
            }
        } else if (obj.forEach && obj.forEach !== forEach) {
            obj.forEach(iterator, context);
        } else if (isArrayLike(obj)) {
            for (key = 0; key < obj.length; key++)
                iterator.call(context, obj[key], key);
        } else {
            for (key in obj) {
                if (obj.hasOwnProperty(key)) {
                    iterator.call(context, obj[key], key);
                }
            }
        }
    }

    return obj;
};

..........................................................................................。

myloopfile.js中的myLoop就像这样调用

var looper = require(‘../myloopfile.js);

looper({
        loop1: function(Home) { //do something },
        loop2: function(Home) { //dosomething }
    }, function(return1, return2) {
        //do something else
    });

我想找出这个

的位置
function(return1, return2) {
        //do something else
});
来自哪里?我没有看到该文件中的任何内容表明附加了一个方法。参数return1和return2来自哪里?这是一些附加东西的javascript方式吗?

2 个答案:

答案 0 :(得分:1)

因此,javascript具有名为anonymous function的函数,不需要函数名称。

基本上它(在这种情况下)用作扩展参数的一种方式。

以javascript函数setTimeout

为例

setTimeout可以将匿名函数作为其参数之一,即

var timer = setTimeout(function{
                          //do something
                         },
                       2000); 

 // setTimeout(function, time, paramters)

因此,您不必声明函数并将其作为参数传递

回到你的情况,你有这个匿名函数,它接受return1和return2

所以最后:

  return1 = obj[key];
  return2 = key;

答案 1 :(得分:1)

var myLooper = function (obj, iterator, context) {
    /* .... */
    iterator.call(context, obj[key], key);
    /* .... */
};

你通过:

looper({
    loop1: function(Home) { //do something },
    loop2: function(Home) { //dosomething }
}, function(return1, return2) {
    //do something else
});

所以

obj = {
    loop1: function(Home) { //do something },
    loop2: function(Home) { //dosomething }
}

iterator = function(return1, return2) {
    //do something else
}

Function.prototype.call()方法调用具有给定this值的函数和单独提供的参数。因此,在你的迭代器函数里面:

this = context;
return1 = obj[key];
return2 = key;