JavaScript:将匿名函数赋值给变量时,不传递函数返回值,而是将函数作为字符串传递

Ome*_*ega 6 javascript anonymous-function

我正在尝试学习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; }
Run Code Online (Sandbox Code Playgroud)

问题是,当条件语句的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中测试了代码,结果是一样的.

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

Dar*_*rov 15

你需要通过传递两个参数来调用函数,因为否则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);
Run Code Online (Sandbox Code Playgroud)

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