1

是否可以将可选参数传递给javascript中的函数?

我在 JavaScript 中有一个函数,并且我想要 reicly,所以,我在函数内部使用 var 选项,我想将变量传递给 param。

我的功能如下:

javascript:

function DrawChartPie(rows, title, chart_div, legend_position) {
google.load("visualization", "1", {packages:["corechart"]});
    google.setOnLoadCallback(drawChart);
    function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Tipo');
        data.addColumn('number', 'Quantidade');
        data.addRows(rows);

        var options = {
            width: 450,
            height: 250,
            title: title,
            legend: legend_position,
        backgroundColor: 'transparent',
                    is3D: true,
                    chartArea: {width:"90%"}
        };

        var chart = new google.visualization.PieChart(document.getElementById(chart_div));
        chart.draw(data, options);
    }

}

帮手:

 html = pie_chart(data, title, div, pos_leg)

我想做的,但它没有工作:

帮手:

 def pie_data(data_pie, div, options = {})
 ....
 optional = {
            width: 900,
            height: 500,
            title: title,
            legend: pos_leg,
        backgroundColor: 'transparent',
                    is3D: true,
                    chartArea: {width:"90%"}
        };
...
html = pie_chart(data, title, div, pos_leg, optional)

javascript:

function DrawChartPie(rows, title, chart_div, legend_position, optional = {}) {
google.load("visualization", "1", {packages:["corechart"]});
    google.setOnLoadCallback(drawChart);
    function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Tipo');
        data.addColumn('number', 'Quantidade');
        data.addRows(rows);

        var option = optional || {
            width: 450,
            height: 250,
            title: title,
            legend: legend_position,
        backgroundColor: 'transparent',
                    is3D: true,
                    chartArea: {width:"90%"}
        };

        var chart = new google.visualization.PieChart(document.getElementById(chart_div));
        chart.draw(data, option);
    }
}

当我尝试时,不要显示任何内容。

有可能做这样的事情吗?如果是的话,有人可以帮助我吗?

谢谢=]对不起我的英语:P

---- 更新 ---- 我更新了我的方法,如 sugest,但现在我遇到了另一个错误。

javascript:

 function DrawChartPie(rows, title, chart_div, legend_position, optional) {
 ...
 var optional = optional || {
            width: 450,
            height: 250,
            title: title,
            legend: legend_position,
        backgroundColor: 'transparent',
                    is3D: true,
                    chartArea: {width:"90%"}
        };
 ...

 }

帮手:

 def pie_data(data_pie, div, options = {}){
 ...
 optional = {
            width: 900,
            height: 500,
            title: title,
            legend: pos_leg,
        backgroundColor: 'transparent',
                    is3D: true,
                    chartArea: {width:"90%"}
        };
  html = pie_chart(data, title, div, pos_leg, optional)
  }

我的错误:参数数量错误(5 比 4)

我已经重新启动了我的服务器:P

4

3 回答 3

1

在实施 ECMA Script 6 标准之前,不可能将默认/可选参数传递给函数

但你能做的是,

function DrawChartPie(rows, title, chart_div, legend_position, optional) {
     optional = optional || {};

如果optional具有虚假值,{}则将分配给optional

optional = optional || {};

和写一样

if (!optional) {
    optional = {};
}
于 2014-03-25T13:23:21.943 回答
1

有点。从技术上讲,所有 JavaScript 参数都是可选的,默认为undefined. 这就是您拥有不同默认参数的方式。

function DrawChartPie(rows, title, chart_div, legend_position, optional) {
  optional = optional || {};

如果您期望null, NaN, 0, ""(空字符串)和等虚假值作为false可选参数的值,则可以使用它来代替:

function DrawChartPie(rows, title, chart_div, legend_position, optional) {
  optional = optional === undefined ? {} : optional;
于 2014-03-25T13:23:30.343 回答
1

我发现将任何可选值传递给函数的最佳方法是使用对象而不是参数列表。这也意味着参数也不必按任何顺序排列。您需要做的就是在将属性与任何对象一起使用之前测试它们是否存在。

function DrawChartPie(options) {
  if (options.rows) { data.addRows(options.rows); }
  if (options.title) { document.getElementById('title').innerHTML = options.title; }
  if (options.optional) { // loop over the object or whatever; }
}

DrawChartPie({
  rows: data,
  title: 'mychart',
  optional: {}
});
于 2014-03-25T13:31:46.393 回答