如何使用JavaScript'的嵌套函数起作用
How do JavaScript's nested functions work?
我是JavaScript世界的新手。今天,在使用JavaScript时,我发现了以下片段:
function sum (a) {
var sum = a;
function f (b) {
sum += b;
return f;
}
f.toString = function () {
return sum;
}
return f
}
//Calling the function
console.log(sum(4)(5));
你能帮我理解f.toString
是什么时候执行的吗?
当您将对象传递给console.log()
时,它会调用.toString()
以打印出值。
因此,
sum(4)
返回一个函数。对该函数的后续调用
sum(4)(5)
还返回一个函数。然后将其传递给console.log()
,控制台中的结果是
9
需要注意的是,console
API是一个相当不稳定的准标准,因为它是作为调试辅助工具设计的,所以有些行为可能会令人困惑。然而,在这种情况下,它似乎只是简单地调用.toString()
,而没有任何其他"有用"的有趣业务。然而,如果您只是将一个简单的空对象传递给console.log()
,就像这个
console.log({})
您可以(至少从Firefox中的Firebug(获得一个有用的界面来导航对象。如果你正在调试某个东西,这很好,但如果你试图了解语言是如何工作的,这种行为可能会令人困惑。
最后要注意的是,发布的代码中的技巧可以扩展,这样该函数也可以通过添加.valueOf()
方法来泄露数字结果:
function sum (a) {
var sum = a;
function f (b) {
sum += b;
return f;
}
f.toString = function () {
return sum;
};
f.valueOf = function() {
return sum;
};
return f;
}
如果你这样做,那么你会从得到正确的答案
console.log(2 * sum(4)(5))
sum(4)(5)
时,首先执行sum(4)
,返回函数f
。
此函数可以访问变量sum
(由于JavaScript函数[1]的闭包属性(。此函数进行求和并再次返回函数f
。
这一次console.log
试图打印函数f
,因此我们通过定义f.toString
来打印总和来明确定义应该如何打印函数。
编辑:如果你想知道为什么要花这么多时间简单地加两个数字,请尝试以下操作:
add(2)(1)(45)(22)
这是因为现在f
被递归调用,sum
被更新,同样是由于闭包属性。
1:即使在父函数超出范围后,内部函数也可以访问父函数的变量。
- 用嵌套函数和默认函数定义函数
- d3中堆栈函数和嵌套函数之间的差异
- JavaScript 中的嵌套函数和 “this” 关键字
- Javascript中带有返回值的嵌套函数
- 访问嵌套函数结构中的JavaScript父函数变量
- 从嵌套函数访问函数属性
- 如何在javascript中使用嵌套函数作为生成器(使用“inner”yields)
- Javascript嵌套函数属性继承
- 我对“;返回true"嵌套函数内部;t工作
- JS中的嵌套函数
- 如何在嵌套函数中获取$(this)
- Jasmine中返回Deferred的模拟嵌套函数
- 如何在嵌套函数jquery上保持变量的值不变
- JavaScript中的深度嵌套函数
- Jquery从嵌套函数返回
- 使用'这'在类中的嵌套函数中
- 如何从上面的嵌套函数返回
- 从JavaScript中的嵌套函数返回值
- Javascript OOP-从函数返回一个值;s在对象内部's方法(嵌套函数)
- Javascript对象/名称空间-如何访问从嵌套函数添加的属性(包括示例)