javascript - 匿名函数从哪里获取参数

标签 javascript windows-8 microsoft-metro winjs windows-applications

我正在学习借助一本书开发 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/

相关文章:

c# - 更新另一个页面上的控件 Windows 8 Metro 应用程序 C#

javascript - 如何正确使用 JsonUtils.safeEval() 中的 JSArray<T> 对象?

javascript - HTML 在链接上淡入淡出音乐

c# - XAML数据绑定(bind),对象与目标类型不匹配

javascript - 本地推送通知到 Win8 Live Tile 在应用程序内运行 JS 代码

c++ - Windows 8 SDK 库位置

email - 如果我使用共享契约(Contract)和共享文件,是否可以在 Windows 8 Metro 应用程序中为邮件应用程序设置主题?

javascript - 在变暗的页面上显示模态 DIV

Javascript 为什么对象属性在头脚本中可以,但在 html 中未定义?

xaml - Windows 8 图像均匀填充居中