函数内部函数javascript

时间:2013-06-26 13:34:37

标签: javascript function

我有一个.js文件,看起来像这样:

function regionmap () { 
var width = 960,
    height = 500,
    centered;

var projection = d3.geo.albersUsa()
    .scale(width)
    .translate([width / 2, height / 2]);

var path = d3.geo.path()
    .projection(projection);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .attr("id","svg");

var states = svg.append("g")
    .attr("id", "states")



    d3.json("readme.json", function(json) {
      d3.select("svg").selectAll("path")
          .data(json.features)
          .enter()
          .append("path")
          .attr("d", path)
          .on("click", clicked)
          .append("title") 
          .text(function(d) { return d.properties.name; });
});


listofnames = new Array();
listofnames.push("Regions:");

function clicked (d) { 

    var regionname = d.properties.name;

    var currentclass = d3.select(this).attr("id") ;

    if (currentclass == "active") {
        d3.select(this).attr("id", "nonactive");
    } else {
        d3.select(this).attr("id", "active");
    }
    var contains;
    var index;
    for (var i = 0; i < listofnames.length; i++) {
        if (regionname != listofnames[i]) {
            contains = false;
        } else {
            contains = true;
            index = i;
            break;
        }
    }

    if (contains == false){
        listofnames.push(regionname);
    } else if(contains == true){

        listofnames.splice(index,1);
    }

    var x=document.getElementById("demo");
    x.innerHTML=listofnames;    
}


    function sendingvariable (){
        window.location.href = "../php/fileregions.php?name=" + listofnames; 
    }


}

问题是当从html调用函数时,我首先在click(onclick =&#34; regionmap())上调用函数regionmap,这很好用。但是,我需要从html调用函数sendingvariable,我无法做到。 有什么方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

您可以使用模块化模式的变体使外部范围可见:

function global() {
    function a() {};
    function b() {};

    // public api
    return {
        b: b
    }
}

var glob = global();
glob.b();

现在,内部b功能可全局访问,而a仍然是私有的。

答案 1 :(得分:0)

函数a和b对全局函数范围之外的任何东西都隐藏(称为closure)。您可以从包含a和b函数的全局函数(对象)返回一些内容。然后,您可以从那里调用这些函数:

function global(){
    return{
        a: function(){
           // do something on a
        },
        b: function(){
           // do something on b
        }
    }
}

// Call like so:
global().a();

答案 2 :(得分:0)

尝试在window.b = b之后添加function b()

答案 3 :(得分:0)

如果你需要调用一个没有来自global()局部变量的东西的(),你可以将它声明为单独的函数。 如果你需要OOP模型,你应该从global创建对象,然后调用a()。声明也必须看:

function global() {
    var a = function() { ... }
}

然后你可以这样称呼它:

var obj = new global();
obj.a();

很抱歉,如果我没有理解你的问题。