javascript mystery - 函数如何访问外部变量

时间:2015-06-09 15:06:58

标签: javascript

我对javascript很新,并试图理解一些非常重要的事情 - 至少我希望:)事情。

我的问题很笼统,但我有一个具体的例子可以帮助我提出问题并帮助你理解我的意思。

示例:

function updateBookmark(bookmark){
    var index = _.findIndex($scope.bookmarks, function(b){
        return b.id == bookmark.id;
    });
    return index;
}

很明显,findIndex函数是在某处声明(在我们的例子中是 - lodash.js) 它有两个参数(至少两个可见参数:数据集和函数)

第一个问题:

在这个例子中,什么是b ? b如何获得它的价值?我理解b是每个数据集的对象,但我的意思是 - 这里的幕后工作是什么,所以b会是什么?

第二个问题:

作者选择通过bo​​okmark.id,

传递一个等于b.id的匿名函数

我知道他可以在他使用的地方使用bookmark.id,但是 findIndex如何访问这个书签?!

这个函数我之前得出的结论是在其他地方声明的,它是否得到了范围内的所有变量如何? 这里发生了什么?

先感谢响应者,并对这个凌乱的问题感到抱歉...... 吉姆。

1 个答案:

答案 0 :(得分:1)

如果你改写了一些东西,就会更容易理解。

从最后一部分开始:

// Q: "How does `findIndex`have access to `bookmark`"
_.findIndex(bookmarks, function (b) { });
// A: "It doesn't."
var bookmark = { id: 1 };
var bookmarks = [ /* ... */ ];
function compareWithBookmark( test ) {
  return test.id === bookmark.id;
}
_.findIndex(bookmarks, compareWithBookmark);

如您所见,findIndex实际上无权访问书签 相反,它可以访问一个函数,它可以传递一个值来测试,该函数将返回该测试是通过还是失败。

.findIndex[].map[].filter的封面下,他们只是采取一个函数,创建一个循环,每次将一个元素传递给函数,并且用返回值做某事。

function findIndex (array, test) {
  var index = -1;
  var i = 0;
  var l = array.length;
  var el;
  var result;

  for (; i < l; i += 1) {
    el = array[i];       // <-- how `b` got its value
    result = test(el, i, array); // <-- test(b)
    if (!!result) {
      index = i;
      break;
    }
  }

  return index;
}

不同的函数会对结果做不同的事情(map返回一个包含每个result的新数组,filter返回一个只传递!!result个测试的数组,等等),但所有这些都是内循环。

这也是循环结构和注意事项的一个非常简单的简化,但它正是推动你预期行为的原因。

修改

这是我刚刚定义的函数的完整用法,加上数组,以及我正在检查的对象。

var bookmarks = [
  { id:  2 },
  { id:  3 },
  { id:  6 },
  { id: 14 }
];

var bookmark = { id: 3 };
function compareBookmarkIdTest (el) {
  return el.id === bookmark.id;
}

var index = findIndex(bookmarks, compareBookmarkIdTest);
index; // 1

希望有所帮助。