- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通过 Javascript Koans 工作,我对以下代码很感兴趣:
it("should use lexical scoping to synthesise functions", function () {
function makeMysteryFunction(makerValue)
{
var newFunction = function doMysteriousThing(param)
{
return makerValue + param;
};
return newFunction;
}
var mysteryFunction3 = makeMysteryFunction(3);
var mysteryFunction5 = makeMysteryFunction(5);
expect(mysteryFunction3(10) + mysteryFunction5(5)).toBe(FILL_ME_IN);
});
它得到 23,这很好。我感到困惑的是,赋予“mysteryFunction3”变量的参数如何/为什么作为“param”传递给 doMysteriousThing 函数。
如果有一个内部函数和一个外部函数,每个函数都接受一个参数,那么在给定指定参数的情况下定义一个等于外部函数的变量是否只是生活中的一个事实,例如:
var mysteryFunction3 = makeMysterFunction(3);
将使它发送一个参数到外部函数的变量实例,如:
mysteryFunction3(10)
会导致参数 (10) 被读取为内部函数的参数吗?
最佳答案
起初我也很难理解这一点。这就是我一击一击达到清晰度的方式。这是我关于堆栈的第一篇文章,请原谅我啰嗦。
让我们来看一个返回字符串的非常基本的函数:
function fun() {
return 'Hi!';
}
如果我们在没有调用括号的情况下记录上述函数,控制台只会记录对该函数的引用:
console.log(fun); //logs ---> [Function: fun]
如果我们再次记录它,但带有调用括号:
console.log(fun()); //logs ---> Hi!
函数的调用等于它的返回值:
console.log(fun() === 'Hi!'); //logs ---> true
因此,在此基础上,让我们重写我们的函数,在其中声明另一个返回字符串的函数。外部函数将返回内部函数的调用:
function funAgain() {
function innerFun() {
return 'Hello there!';
}
return innerFun();
}
所以在 funAgain 的范围内(innerFun() === 'Hello there!')计算结果为真,所以当我们将 funAgain 的调用记录到控制台时:
console.log(funAgain()); //logs ---> 'Hello there!'
但是,如果我们在外部函数的返回语句中省略了 innerFun 的调用括号呢?
function funAgain() {
function innerFun() {
return 'Hello there!';
}
return innerFun;
}
console.log(funAgain()); //logs [Function: innerFun]
函数 ITSELF 被返回。虽然这实际上不是全部,但我们可以想到 (funAgain() === innerFun) 显然,由于范围问题,您实际上无法在实践中运行此比较(innerFun 不能在调用 funAgain 之外存在) .但!让我们暂时这样想。这意味着如果我们在变量中捕获 funAgain 的返回值:
var innerFunCaptured = funAgain();
console.log(innerFunCaptured); // logs [Function: innerFun]
从概念上讲,我们有 (innerFunCaptured === innerFun) ...
现在我们的变量已绑定(bind)到内部函数,我们可以通过向变量添加括号来调用该内部函数。
console.log(innerFunCaptured()); //logs ---> 'Hello there!'
当我在谈论上面的“整个故事”时,我遗漏了内部函数对变量的绑定(bind)是外部函数调用的结果,所以实际上绑定(bind)不仅包括 innerFun 本身,还包括它在其中创建的环境包括通过调用外部函数传递的任何潜在参数,这使我们能够...
再次重写外部和内部函数,使它们现在具有交互的参数:
function funOnceMore(greetingPartOne) {
function innerFun(greetingPartTwo) {
return greetingPartOne + ' ' + greetingPartTwo;
}
return innerFun;
}
如果我们用参数记录 funOnceMore 会怎么样。
console.log(funOnceMore('Hello')) //logs ---> [Function: innerFun]
再次返回 innerFun 本身。但是我们传递的参数 greetingPartOne 呢?好吧,它顺利通过了,但是由于从未在 funOnceMore 中调用 innerFun,因此从未以任何有意义的方式使用过 greetingPartOne。我们必须弄清楚如何调用 innerFun!答案:我们需要像上一步一样将它绑定(bind)到一个变量。
var innerFunCapturedAgain = funOnceMore('Hello')
现在 innerFunCapturedAgain 保存 innerFun 和 funOnceMore 的环境以及我们传递给它的参数“Hello”。
现在我们可以通过在 innerFunCapturedAgain 上加上圆括号来调用 innerFun,这些圆括号将封装我们传递给 innerFun 的 greetingPartTwo 的参数。
console.log(innerFunCapturedAgain('there!')) //logs ---> 'Hello there!'
关于javascript - javascript中的词法范围参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605471/
我试图了解传递给 setTimeout 的箭头函数如何记住上一个执行上下文中的 this 的值。我知道在执行箭头函数时会使用词法作用域规则查找 this 值。这是否意味着箭头函数关闭变量和 this
这个问题已经有答案了: How does the "this" keyword in Javascript act within an object literal? [duplicate] (4 个
我已阅读 this问题,我想我已经理解了投票最多的答案,但他说 since basically every programming language in wide use today uses le
如何让这段宏发挥预期的作用? -- 我想从词法环境中捕获 p 而不必将其作为参数发送给宏。 (define-syntax-rule (fi a b) (if p a b)) ;--->capt
Program A() { x, y, z: integer; procedure B() { y: integer; y=0;
我正在用 Java 实现自己的链表。节点类只有一个名为“name”的字符串字段和一个名为“link”的节点。现在我有一个测试驱动程序类,它只按顺序插入几个名字。现在,我正在尝试编写一种排序方法来按字母
考虑到这个question SO,其中调用了整个 C# 内存中编译器。只有lexical and syntactic analyzing时是必需的:将文本解析为词素流,检查它们并退出。 在System
我有 2 个场景。 这失败了: class F { public X X { get; set; } } 错误 CS0102:类型“F” ' 已经包含 ' X 的定义| ' 这个有效: class
我有一个用 NodeJS 执行的 .js 文件。这是我的文件的内容: var ctry = "America"; function outer(msg) { console.log(msg +
我对编写汇编程序的概念非常陌生,即使在阅读了大量 Material 之后,我仍然很难理解几个概念。 将源文件实际分解为 token 的过程是什么?我相信这个过程称为词法分析,我已经到处搜索有意义的真实
在 static scoping,标识符可以通过分析/解析源代码来确定(与动态作用域不同,动态作用域或多或少需要了解调用者环境)。 我的问题是这样的,因为静态作用域只需要解析源代码以了解作用域和标识符
编辑:我在第一个答案后更改了示例代码,因为我想出了一个简单的版本来回避相同的问题。 我目前正在学习 Common Lisp 的作用域属性。在我认为我有一个坚实的理解之后,我决定编写一些我可以预测结果的
考虑这段代码: class Bar(object): pass class Foo(object): def bar(self): return Bar() f = Foo() def Bar
将 ES6 箭头函数与词法 this 绑定(bind)结合使用非常棒。 但是,我刚才在使用典型的 jQuery 单击绑定(bind)时遇到了一个问题: class Game { foo() {
将 ES6 箭头函数与词法 this 绑定(bind)结合使用非常好。 但是,我刚才在将它与典型的 jQuery 点击绑定(bind)一起使用时遇到了一个问题: class Game { foo(
我是一名优秀的程序员,十分优秀!