2013-06-26 7 views
0

У меня есть файл .js, который выглядит примерно так:функция внутри функции Javascript

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 Я сначала вызвать функцию regionmap на клик (OnClick = "regionmap ()), который работает хорошо.Однако мне тогда нужно вызвать функцию sendvariable из html, и я не могу. Любой способ решить это?

+0

Покажите нам немного больше кода, пожалуйста? какие переменные? (потому что прямо сейчас мое решение, удалите '}' из строки 4 и переместите его в конец строки 1. Затем выполните функции a и b. – Biketire

+0

Изучите образец модуля здесь: http: //www.adequatelygood .com/JavaScript-Module-Pattern-In-Depth.html – n8wrl

+0

Затем просто объявите его как 'window.b || (window.b = function() {});' – Ian

ответ

0

Функции a и b скрыты от чего-либо вне глобальной функции scope (называется closure). Вы можете вернуть что-то из глобальной функции (объекта), которая содержит a и b функций. Затем эти функции можно вызвать оттуда:

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

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

Это работает, но у меня все еще есть проблема. Я просто сделал возврат для функции b, в функции b Я использую переменную, объявленную в глобальном, но обновленную в a. Дело в том, что при использовании b мне нужна эта переменная, которая была обновлена ​​с a. Как и я, он не получает обновленную переменную. Любая идея решить это? – nuri

+0

Если это то, что вам нужно, вам нужно создать экземпляр глобальной функции (которая станет самим объектом). var myGlobal = new global(); myGlobal.a(); –

+0

thx !!!! ! it works =) – nuri

0

Попробуйте добавить window.b = b после function b().

1

Вы можете сделать его видимым для внешней области с использованием изменения модульной схемы:

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

    // public api 
    return { 
     b: b 
    } 
} 

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

Теперь внутренняя b функция доступна во всем мире, в то время как a все еще частные.

0

Если вам нужно позвонить() без каких-либо изменений из глобальных() локальных переменных, вы можете просто объявить его как отдельную функцию. Если вам нужна модель ООП, вы должны создать объект из глобального, а затем вызвать a(). Кроме декларации должны смотреть:

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

И тогда вы можете назвать это так:

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

Извините, если я не понял ваш вопрос правильно.