3

我正在使用各种书籍学习 javascript,但我注意到我无法找到关于何时使用 return 的充分解释。我知道当你想从一个函数返回一个值时你会使用它,但是还有来自 Javascript: The Good Parts 的例子:

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

var myQuo = quo("amazed");

document.writeln(myQuo.get_status());

当 quo 函数已经可以使用 status 作为参数时,为什么必须返回它?换句话说,为什么简单

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)?

4

4 回答 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对象的用户不能更改对象的内部status属性quo,他们只能读取它

var status = quo.get_status();
于 2013-07-27T15:20:13.770 回答
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/

于 2013-07-27T15:30:09.373 回答
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);会在循环中创建警报。

于 2013-07-27T15:30:35.083 回答
1

您在此示例中看到的是闭包演示(请参阅),并status像私有变量一样保存在对象中。

于 2013-07-27T15:19:40.487 回答