- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对将一个函数嵌套在另一个函数中的概念很陌生,我不明白需要返回一个函数而不是立即返回我想要的值。
感谢任何帮助我消除困惑的帮助!
第一种方法(我本能地会写,但结果是错误的):
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?
感谢您的帮助!
最佳答案
Why does method 1 not work when method 1.1 works?
因为在方法 1 中,您试图调用从 wrapValue
返回的值,就好像它是一个函数一样,但事实并非如此;它是一个数字(您传入的数字)。在方法 1.1 中,您直接使用返回值,而不是尝试像函数一样调用它。
让我们稍微分解一下:
var wrap1 = wrapValue(1);
现在,在 wrap1
中,我们有数字 1
。不是一个函数,只是数字。因此,要使用该数字,我们只需直接使用它即可:
console.log(wrap1); // 1
您无法调用 wrap1
,因为该变量不引用函数,而是包含一个数字。
And why the need for method 2?
如果您出于某种原因需要在调用函数wrapValue
返回时访问localVariable
,则只需要方法2 。下面的示例展示了这种情况可能会如何改变:
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
函数参数实际上是函数中的局部变量。 (实际上,不是字面意义上的。)
关于javascript - 定义函数时,为什么需要返回一个函数而不是直接返回我想要的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25200962/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!