如何在 JavaScript 函数外部访问函数参数?

9

我能在函数外部访问函数参数吗?

这是我的代码:

function viewmessage(username,name) {
        //alert(name + " : " + username);
        $('#heading').html(name);
        $.get('/notification/viewmessage', {user:username}, function(data) {
            $('#messagesfrom').html(data);
            $('#newmessage').slideDown(200);
        });
    }
alert(name + " : " + username);

5
没有一种“好的”方式去做,因为它本来就不应该被做。 - alex
不确定你在这里的问题是什么。JavaScript和大多数语言一样,无法访问其范围之外的变量。你想做什么(更多的代码可能会有所帮助)。 - Paddy
1
那是不可能的。同时,这些参数必须来自某个地方,对吧?你怎么称呼这个函数?为什么要在函数外部发出警报? - Didier Ghys
你做这件事的主要动机是什么?在你的例子中,警报行可以很容易地在函数内部完成。 - jlemos
6个回答

6

除非你在函数外部声明变量,否则无法这样做。

你只能在全局作用域中使用相同的变量名称:

function viewmessage(username, name){
    window.username = username;
    window.name = name;
}
alert(window.name + " : " + window.username ); // "undefined : undefined"
alert(name+" : "+username); // ReferenceError: 'name' not defined

在局部作用域中,您必须使用在函数内重新声明的变量名:
var username2, name2;
function viewmessage(username, name){
    username2 = username; // No "var"!!
    name2 = name;
}
alert(username2 + " : " + name2); // "undefined : undefined"
viewmessage('test', 'test2');
alert(username2 + " : " + name2); // "test : test2"

2
@NickyDeMaeyer 你提到了使用全局变量。这并不推荐,因为可能会与其他嵌入式脚本发生变量冲突。此外,全局作用域不应该被不必要的全局变量污染。 - Rob W

6

您可以使用正则表达式(RegEx)获取参数:

function viewmessage(username, name) {/*...*/}
var args = viewmessage.toSource()
           .match(/\((?:.+(?=\s*\))|)/)[0]
           .slice(1).split(/\s*,\s*/g);
//args = ["username", "name"]

请确保在 ( 之后和 ) 之前没有任何空格。否则,您可能会得到以下结果:
function viewmessage( username, name ) {/*...*/}
var args = viewmessage.toSource()
           .match(/\((?:.+(?=\s*\))|)/)[0]
           .slice(1).split(/\s*,\s*/g);
//args = [" username", "name "]

或者在收集参数后对每个参数使用 trim()

args.forEach(function (e, i, a) {a[i] = e.trim();});
//args = ["username", "name"]

1

你可以在函数中返回这些变量:

var viewmessage = function(username, name){
    // Blabla
    return {
        username: username,
        name: name
    }
}

// And then...
var vm = viewmessage('wutup', 'Peter');
alert(vm.name +" : "+ vm.username);

1
在函数中,我们将用户名作为提交按钮的ID,或者也可以使用一个空的div。
function viewmessage(username,name){
        //alert(name+" : "+username);
        $("#submit").attr('id', username);
        $('#heading').html(name);
        touser = username;
        $.get('/notification/viewmessage',{user:username},function(data){
            $('#messagesfrom').html(data);
            $('#newmessage').slideDown(200);
        });
    }
var touser = $("#submit").attr("id");
alert(touser);

感谢那些回答我的问题的人。


0

这与参数的作用域及其定义位置有关。您需要将警报包装在接收参数的函数中。可以是调用viewMessage然后alert的函数,或者如果您想在ajax请求之后弹出警报,则将警报移动到成功处理程序中,如下所示:

function viewmessage(username,name){
        $('#heading').html(name);
        $.get('/notification/viewmessage',{user:username},function(data){
            $('#messagesfrom').html(data);
            $('#newmessage').slideDown(200);
            alert(name+" : "+username);
        });
    }

0

你不能从函数外部访问函数的参数。这就是变量作用域的全部意义。

如果你想要访问变量的值,你需要将该值从函数内部传递给全局变量,然后你就可以从外部访问该值。

不要混淆变量和值。


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