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页面中出现了以下内容:

函数 (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))); } 其他 { 返回 0; } }

我已经在 Chrome 和 Firefox 中测试了代码,结果是一样的。

任何帮助表示赞赏,并提前感谢您。

4

1 回答 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函数开头声明的两个变量。

于 2010-02-20T10:35:23.537 回答