- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在做一些关于函数式编程的练习,并返回一个闭包时,遇到了这个例子,但无法弄清楚它是如何工作的:
function invoker (NAME, METHOD) {
return function(target) {
var targetMethod = target[NAME];
var args = _.rest(arguments);
return function() { return targetMethod.apply(target, args);});
};
};
测试:
var rev = invoker('reverse', Array.prototype.reverse);
var result= _.map([[1,2,3]], rev);
输出应该是:
[[3,2,1]]
但我无法证明。
具体问题:为什么是 args:
0,1,2,3
为什么是console.log(arguments):
[object Arguments]
如何打印出结果,看[[3,2,1]]。当我打印出“结果”时,我得到:
[object Object]
最佳答案
更正代码中的问题(缺少分号或太多)后,似乎在整个脚本执行过程中创建了一些闭包。
首先:
function invoker (NAME, METHOD) {
return function(target) { // In the example this is rev
// Begin Scope1 (closure)
var targetMethod = target[NAME]; // NAME is trapped here in Scope1 (defined outside of this function) when the function is executed!
var args = _.rest(arguments);
return function() { //
// Begin Scope2 (closure)
return targetMethod.apply(target, args); // target and args are trapped here in Scope2 (defined in Scope1's function) when the function is executed!
};
};
}
调用者在调用它之前什么都不做,并且在实际调用调用者之前不会创建第一个闭包(即 Scope1):
var rev = invoker('reverse', Array.prototype.reverse);
在 rev 被调用者初始化后,它变成了一个变量,其中包含一个函数,该函数接受一个命名参数(称为目标),当被调用时,它将在任何情况下寻找一个名为 NAME(在本例中为“reverse”)的函数对象目标是。
当实际调用 rev 时,它还会返回一个函数,该函数在调用时将调用目标(传入的数组)上的目标方法(在本例中为反向)。但是 rev 在下一行运行之前没有被调用:
var result= _.map([[1,2,3]], rev);
这是这里发生的事情:_.map 的目的是获取一个项目列表并将一个函数应用于此列表中的每个项目。最终结果将是一个新数组,其中包含转换后的值。上面的行传递给 _.map 一个列表,其中只有一个项目;数组。它还向 _.map 传递一个函数来转换该列表中的每个项目;在这种情况下 rev.
所以 _.map 被调用,它在列表中的唯一项目上调用 rev,我们的 [1,2,3] 数组。函数 rev 具有返回另一个函数的效果,该函数在调用时会记住 NAME、target 和 args。此函数现在位于数组变量“result”的第一个元素内。
现在回答您的问题:
The output should be:
[[3,2,1]]
but i cannot prove it.
在测试代码中没有输出,只有一个名为 result 的最终变量。我认为你正在寻找的是最后的某个地方应该有一个反向数组。您可以在调用初始化结果后验证原始数组是否已被反转:
alert(result[0]().join());
Why is args:
0,1,2,3
args 在这里真的是一个转移话题; _.map 将 3 个参数传递给它的迭代器函数。当前值(在本例中为数组 [1,2,3],键或索引(在本例中为 0)和原始列表本身。当对参数调用 _.rest 时,它会切掉第一项,留下我们一个包含 0 和 [[1,2,3]] 的数组。当在此数组 (args) 上调用 reverse 时,它最终返回一个看起来像 [1,2,3,0] 的数组,这是这两个项目的反转. 我的测试从未显示 0,1,2,3。为什么 args 在这里是一个转移注意力的问题?因为当 reverse 被调用时 reverse 不接受任何参数,所以 args 被忽略。如果这是不同对象上的不同函数,你可能会因为调用 _.rest 而遇到问题。
Why is console.log(arguments):
[object Arguments]
因为您基本上是调用 toString() 来打印对象的类型。
How to print out the result, to see [[3,2,1]]. When I print out "result", I get:
[object Object]
您可以使用:
console.log(result[0]().join());
更新:这是带有工作代码的 jsbin 链接:http://jsbin.com/aYECIDo/5/edit?html,css,js,output
关于javascript - 这个javascript是如何工作的,函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20363857/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!