当定义一个函数时,为什么我需要返回一个函数而不是直接返回我想要的值?
When defining a function, why do I need to return a function instead of returning the value I want straightaway?
我对嵌套函数在另一个函数中的概念不熟悉,我不理解返回函数而不是直接返回我想要的值的必要性。
感谢任何帮助我澄清我的困惑!
第一个方法(我本能地会写,但结果是错误的):
function wrapValue(n) {
var localVariable = n;
return localVariable;
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());
// → Uncaught TypeError: number is not a function
我尝试了方法1的一个更简单的版本(方法1.1):
function wrapValue(n) {
var localVariable = n;
return localVariable;
}
console.log(wrapValue(6));
// → 6
第二种方法(正确的方法):
function wrapValue(n) {
var localVariable = n;
return function() {
return localVariable;
};
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());
// → 1
// → 2
方法1.1可以工作,为什么方法1不能工作?为什么需要方法2?
谢谢你的帮助!
方法1.1可以工作,为什么方法1不能工作?
因为在方法1中,你试图调用你从wrapValue
得到的值,好像它是一个函数,但它不是;这是一个号码(你输入的号码)。在方法1.1中,您直接使用返回值,而不是像调用函数那样调用它。
让我们来分解一下:
var wrap1 = wrapValue(1);
现在,在wrap1
中,我们有数字1
。不是一个函数,只是一个数字。因此,要使用数字,我们只需直接使用它:
console.log(wrap1); // 1
你不能调用 wrap1
,因为变量不指向函数,它包含一个数字。
为什么需要方法2?
你只需要方法2,如果你有一些原因,你需要访问localVariable
发生当你调用函数wrapValue
返回。下面是一个示例,显示了可能发生的变化:
function doSomething(n) {
var num = n;
return function() {
++num;
return num;
};
}
var f = doSomething(0);
console.log(f()); // 1
console.log(f()); // 2
console.log(f()); // 3
因为调用函数doSomething
返回会改变变量num
的值,我们希望每次调用它时都得到最新的版本。
在这里,我使用了一个局部变量,使其类似于您的原始示例,但我们可以直接使用n
:
function doSomething(n) {
return function() {
++n;
return n;
};
}
var f = doSomething(0);
console.log(f()); // 1
console.log(f()); // 2
console.log(f()); // 3
函数参数实际上是函数中的局部变量。(实际上,而不是字面上)
你的第一个函数出错了,它应该是:
function wrapValue(n) {
var localVariable = n;
return localVariable;
}
var wrap1 = wrapValue(1);
var wrap2 = wrapValue(2);
console.log(wrap1);
console.log(wrap2);
和预期的一样。
方法1完全是错误的。
当你调用wrapValue
时,你返回localVariable
,它被设置为1
和2
,这些是数字,不能作为函数调用。
这也是你在方法1.1中所经历的。
对于方法2,这可能是隔离不希望流到父作用域的变量的一种方法。它在你的例子中没有用,但在你立即调用定义的函数的情况下,它是广泛的,例如:
var myFn = function() {
var hiddenVar = 1;
return function() {
return hiddenVar;
};
}();
我可以回答你的第一个问题:为什么方法1不工作?
当你做var localVariable = n;
时,你创建了一个名为localVariable
的新变量,并为它分配了类型数字和值n。你返回这个整型值n。
因此,wrap1
和wrap2
是数字。它们不支持只适用于函数的()
操作。在方法1.1中,您直接记录wrapValue(...)
,这与记录数字相同,这是有效的。
希望你能理解。:)
在第一个示例中,您将wrap1 &2 .返回的函数都是数字,然后将给定的数字作为函数调用。
var wrap1 = wrapValue(1); // wrap1 = 1;
var wrap2 = wrapValue(2); // wrap2 = 2;
- 获取最后一个返回值
- 使用谷歌地图:一个返回undefined的自定义javascript函数
- eval(“{}”) vs eval (“x={}”),一个返回 undefined,而另一个返回 {}
- 如何使用 jQuery 创建一个返回 SQL 结果集的函数
- JavaScriptAJAX调用一个返回XML的PHP
- 在什么情况下,您会使用一个返回另一个函数(Javascript)的函数
- 如何创建一个返回等待EventEmitter的promise的函数
- Angularjs模拟一个返回$http承诺的函数
- 如何编写一个返回单个值的java脚本函数,并将返回的值分配给我们想要的任何变量
- Jasmine-测试一个返回localStorage项的服务
- 创建一个返回函数
- 给定子域中的cookie,您可以编写一个返回代理服务器主机名的javascript函数吗
- 在Javascript中给Number添加一个返回变量
- 如何在angularjs中编写一个返回承诺的异步方法
- HTML4和HTML5 -如果没有导航,我怎么知道是否有一个“返回”状态
- 如何在JavaScript中创建一个返回本地文本文件值的函数?
- 如何声明一个javascript变量并将其值赋给一个返回布尔值的php文件
- 如何在异步测试中测试一个返回承诺的存根
- 从php传递一个返回值给js
- 输入一个返回的可观察对象