【问题标题】:How to return an object into a different scope in JavaScript?如何在 JavaScript 中将对象返回到不同的范围?
【发布时间】:2014-11-16 20:39:41
【问题描述】:

当我提交表单时,我想将表单中的一些数据作为对象返回,但我无法将数据置于正确范围内的对象中。我不确定为什么控制台在 onsubmit 事件处理程序中记录 newEvent 变量也会返回一个事件。

如何在外部范围内访问返回的表单数据?

JSFiddle:http://jsfiddle.net/antfish/crp98hhw/40/

var createTaskForm = document.getElementById('create-task'),
    newTask = new Object();

    //Returns empty object (I would like my returned object accessible in this scope)
    console.log(newTask);

function getFormData(id, newTask) {
    var createTaskForm = document.getElementById(id),
        formElements = createTaskForm.elements;

    createTaskForm.onsubmit = function(newTask) {
        var title = formElements['todo-title'].value,
            content = formElements['todo-content'].value;

        newTask.title = title;
        newTask.content = content;

        //Returns Event
        console.log(newTask);

        return newTask;

    }

}

getFormData('create-task');

【问题讨论】:

    标签: javascript object scope


    【解决方案1】:

    通过将newTask 设置为getFormDatacreateTaskForm.onsubmit 的输入参数,您将在这些函数的范围内重新声明该变量。要从外部范围访问值,您只需要引用它即可。

    【讨论】:

    • 感谢您的回复。我已经更新了这个小提琴中的 JS,但是我的第二个控制台日志仍然返回未定义。我肯定错过了什么? jsfiddle.net/antfish/51xb8z76/5
    【解决方案2】:

    尽管定义 getFormData 接受 2 个参数,但您在没有第二个参数的情况下调用 getFormData

    但是getFormData 的第二个参数在函数体中无论如何都没有使用,所以我不知道它为什么在那里。

    此外,从不使用全局定义的 createTaskForm 变量。

    无论如何,如果您希望您在全局范围内定义的newTask 对象由getFormData 创建的回调分配给onsubmit,只需从getFormData 中删除newTask 参数和内部匿名函数。这样,两者都将关闭全局 newTask 对象(即引用它)并且提交事件将导致 newTask 被修改。

    备注:getFormData 的命名很糟糕,因为它什么也不返回。它应该命名为setOnsubmitCallback 之类的。

    例子:

    var newTask = {}; // this is simpler than "new Object()"
    
    function setOnsubmitCallback(formId)
    {
        var createTaskForm = document.getElementById(id);
        var formElements = createTaskForm.elements;
    
        createTaskForm.onsubmit = function () {
            // do your stuff with the newTask object
        };
    }
    
    setOnsubmitCallback('create-task');
    

    现在,每次触发提交事件时(例如,通过单击 <input type="submit"> 元素或其他内容)都会调用您的回调,并且 newTask 对象将包含适当的数据。

    edit:console.log(newTask); 返回事件的原因如下:DOM(文档对象模型)是这样的:当它调用绑定到 DOM 事件的回调时(“onsubmit”作为其中之一),它将第一个参数传递给回调函数,该参数是一个事件对象。因此,当它调用你的回调时,newTask 的值就是那个事件对象。

    【讨论】:

    • 感谢您的回复,有一些旧版本的代码没有被删除(因此 global var 没有被调用)而且该函数应该比现在做的更多,现在的名字不像你说的那样好。我已经编辑了代码,但是根据我对您所说的内容的理解,那么这个小提琴中的第二个控制台日志应该包含填充的对象吗?不知道我在这里缺少什么。 jsfiddle.net/antfish/51xb8z76/5
    • @Antfish 不,不应该。正如我告诉你的,getFormData 将一个事件侦听器绑定到onsubmit 事件,这意味着它只是说“当表单被提交时,应该调用这个函数”。如果您不触发事件,也就是说,如果您不提交表单,那么记录 newTask 对象只会记录当时设置的任何值。您只想在提交表单后记录对象。执行您的代码,然后单击提交按钮,然后在浏览器的控制台中记录 newTask 对象,您将看到它已被填充。
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多