我正在学习借助一本书开发 Windows 8 风格的应用程序。我正在阅读的这一章侧重于用于开发的 HTML、CSS 和 JavaScript 语言。该应用程序在 ListView 中显示“我的图片”文件夹中的图像,并在用户单击或点击图像时将其删除。下面是在 ListView 中实现删除图像的代码:
var lv = document.getElementById('lv');
lv.addEventListener('iteminvoked', function (eventObj) {
eventObj.detail.itemPromise.then(function (listViewItem) {
var binding = files.dataSource.createListBinding();
binding.fromIndex(listViewItem.index).then(function (dataItem) {
var key = dataItem.key;
files.dataSource.remove(key);
binding.release();
});
});
});
我的问题是,addEventListener
方法中匿名函数的eventObj
参数是从哪里取值的?我在这里发现了一个类似的问题:Passing arguments in anonymous functions in JavaScript ,但我不能完全理解它。我在 MSDN 上搜索了 addEventListener
的文档,但它只是说它需要一个事件处理函数,但它没有说明任何关于参数的信息。提前致谢。
最佳答案
这很简单:内部调用该回调的任何函数都会传递参数。看,addEventListener 告诉执行的 Javascript 引擎在事件发生时调用您指定的回调函数。 javascript 引擎将您的匿名函数保存在某个变量中 - 稍后可以使用该确切变量调用它,传递任意数量的参数。
为了说明这一点,考虑像这样处理事件的内部函数(纯属虚构,只是为了说明如何完成):
var callbacks = [];
function addEventListener(newEvent, newCallback) {
callbacks.push({event : newEvent, callback : newCallback});
}
function handleEvent (someEvent) {
for (var i = 0 ; i < callbacks.length ; i++ ) {
if (callbacks[i].event == someEvent.name) {
callbacks[i].callback(someEvent);
}
}
}
更多解释:
由于 javascript 是一种所谓的“函数式语言”,函数只是变量的值。
function someFunc () {}
实际上只是某种快捷方式(从技术上讲它不是,但它做同样的事情)
var someFunc = function () {}
话虽如此,将多个名称与一个函数相关联当然是可能的:
var someFunc = function () {}
var sameFunc = someFunc;
var stillSame = somefunc;
var alsoSame = stillSame;
您可以使用这些名称中的任何一个来调用该函数,当然包括传递参数:
var someFunc = function (arg) { alert(arg); }
var sameFunc = someFunc;
sameFunc("It worx");
您甚至可以在不命名函数的情况下调用它:
(function () {alert("test")})();<
或
(function (arg) { alert(arg); })("test")
使用这个概念来歪曲最终导致(然而还有很长的路要走)像y-combinator这样的事情.
关于javascript - 匿名函数从哪里获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597504/