何时在JavaScript中使用'return'?

3

我正在学习使用各种书籍来了解JavaScript,但是我注意到我找不到一个足够的解释,说明何时需要使用return。我知道当你想从函数中返回一个值时,你需要使用它,但是有些例子,比如来自《JavaScript:精粹》的示例:

var quo = function(status) {
    return {
        get_status: function() {
            return status;
        }
    };
};

var myQuo = quo("amazed");

document.writeln(myQuo.get_status());

为什么在quo函数的参数中已经有状态信息了,还要返回状态呢?换句话说,为什么简单地写成:
return {
    get_status: status;
}

无法工作?

下一页中有另一个示例:

var add_the_handlers = function(nodes) {
    var helper = function(i) {
        return function(e) {
            alert(i);
        };
    };
    var i;
    for (i = 0; i<nodes.length; i+=1) {
        nodes[i].onclick = helper(i);
    }
};

为什么我们要在一个函数中使用alert(i)来返回值,而不是直接使用alert(i)呢?

1
我认为你把延迟执行和立即执行搞混了。function(){ alert() }alert() 不是同一件事情。另外,如果你将它改成 get_status: status,那么它现在是一个属性而不是一个方法(所以用 myQuo.get_status 代替 myQuo.get_status()),并且是只读的,而不是可修改的。 - Brad Christie
1
示例二:你不想立即发出警报,而是想稍后发出警报......你不是返回 alert(I),而是返回调用 alert 的函数。 - Dave Newton
为什么它要将“e”传递给那个函数? - tom c
4个回答

10
return {
    get_status: status
}

不会定义一个getter,也就是返回底层值的函数。它只会定义一个属性。

你可以这样使用它:

var status = quo.get_status;

任何用户都可以使用以下方式更改状态:

quo.get_status = 'new status directly changed';
使用的原因之一是
return {
    get_status: function() {
        return status;
    }
};

这样做的好处是使status成为私有属性: quo对象的用户无法更改quo对象内部的status属性,只能通过以下方式读取它:

var status = quo.get_status();

1

我不会讨论代码为什么会变成这样 - 对我来说,它似乎也过于复杂了 - 但是从技术方面来看:

return {
    get_status: function() {
        return status;
    }
};

这将返回一个函数作为属性get_status,quo的调用者可以随时调用它(x.get_status())。
return {
    get_status: status;
}

这不是有效的 JavaScript,如果你调整它为

return {
    get_status: status
};

quo会返回一个对象,该对象只有一个名为get_status的字符串属性。这也可以工作!您只需以不同的方式检索值即可。

请查看以下(不太优雅的)JSFiddle:http://jsfiddle.net/edw6a/1/


1
第一个示例可能很有用,例如您想在status上添加一些约束条件。请注意,get_status不应从quo内部调用。
var quo = function(status) {
    return {
        get_status: function() {
            return status;
        }
        set_status: function(newValue) {
            if (newValue === 2 || newValue === 0) {
               status = newValue;
            }
        }
    };
};

第二个例子是一个“函数生成器”的示例。根据传递的值,Helper会返回不同的函数。稍后的示例将这些“生成”的函数绑定到点击事件上。在循环中简单地编写alert(i);将创建警报。

1
在这个例子中,你看到的是闭包的演示(查看),status被保存在对象中,就像私有变量一样。

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