JavaScript:当将匿名函数分配给变量时,函数返回值不会被传递,而是作为字符串传递给函数。

7

我想学习JavaScript,但遇到了一些困难。如果答案是显而易见的并且可以通过简单搜索获得,我提前道歉。我是编程和JavaScript的新手,也不确定要遵循哪种查询方式。

在以下代码中,函数从HTML表单中获取值,进行一些处理,然后将它们发送回来。我已经测试了输入和输出过程,它们正常工作。

function foo() {

var x = parseInt(document.formdata.fieldone.value);
var y = parseFloat(document.formdata.fieldtwo.value);

if (isNaN(y))
    { var z = x; }
else
    { var z = function(x, y) {
            if ((y * (x / 100)) < 1) {
                return (x + Math.ceil(y * (x / 100))); }
            else if ((y * (x / 100)) > 1) {
                return (x + Math.round(y * (x / 100))); }
            else {
                return 0; } } }

var bar = document.getElementById("output");

bar.innerHTML = z; }

问题在于,当条件语句的else分支尝试处理匿名函数时,返回值没有被赋值;而是将整个函数作为字符串。也就是说,以下内容出现在HTML页面中:

function (x, y) { if ((y * (x / 100)) < 1) { return (x + Math.ceil(y * (x / 100))); } else if ((y * (x / 100)) > 1) { return (x + Math.round(y * (x / 100))); } else { return 0; } }

我已在Chrome和Firefox中测试了代码,结果是相同的。
感谢您的帮助,提前致谢。
1个回答

17
你需要通过传递两个参数来调用该函数,否则z变量只会存储对该函数的引用,但不会评估它。
var z = (function(x, y) {
    if ((y * (x / 100)) < 1) {
        return (x + Math.ceil(y * (x / 100))); }
    else if ((y * (x / 100)) > 1) {
        return (x + Math.round(y * (x / 100))); }
    else {
        return 0; 
    } 
})(x, y);

请注意,在匿名函数中使用的(x, y)与最后传递的作为参数的两个变量不同,这两个变量对应于foo函数开头声明的两个变量。


谢谢,调用函数总是有帮助的 :) - Omega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接