2017-02-10 6 views
0

y1 и year1 не определены внутри анонимной функции, которая является параметром circle.attr(). Однако, «год1» имеет правильное значение, прежде чем код вводит circle.attr(). Может кто-нибудь объяснить, почему это? ** я получил функцию для работы по замене 2-й параметр с «xYear (у)»Передача значения анонимной функции в качестве аргумента функции

function circleLocation(y) { 
    year1 = y 
    console.log(year1) 
    circle.attr('cx', function(year1) { 
    y1 = year1; 
    console.log(y1) 
    console.log(year1) 
    return xYear(y); 
    }) 
} 

ответ

2

Вы пересматривают year1. Аргументы функции подобны переменным внутри их области действия. Так что это:

function (year1) { 
    // ... 

более или менее такой же, как: (имеет тот же эффект, но это не то же самое)

function() { 
    var year1; 
    // ... 

Переменная year1 является слежка другой year1 (тот, который вы хотите). Попробуйте это:

circle.attr('cx', function() { // without the argument year1 
    y1 = year1; 
    console.log(y1) 
    console.log(year1) 
    return xYear(y); 
}) 
0

вы не были ввел параметры в функции circleLocation(args)

function circleLocation(y) { 
 
    year1 = y 
 
    console.log(year1) 
 
    attr('cx', function(year1) { 
 
    y1 = year1; 
 
    console.log(y1) 
 
    console.log(year1) 
 
    return xYear(y); 
 
    }) 
 
} 
 

 

 
function attr(n,fun){ 
 
} 
 
circleLocation(4);

1

Во-первых, это выглядит, как вы вводите глобальные переменные, так что я предложил бы использовать var, чтобы предотвратить это от происходящего.

var year1 = y; 

Далее, это трудно понять, но я думаю, что вы смущены о том, почему year1 имеет значение перед выполнением вашей анонимной функции и почему это undefined внутри анонимной функции.

Проблема в том, что вы находитесь затенение другая переменная. Ваша анонимная функция принимает параметр с именем year1

circle.attr('cx', function(year1) { 
    ... 

Это означает, что вы объявили переменную с именем year1 внутри, что функции сферы. Всякий раз, когда вы объявляете переменную внутри области видимости, это объявление затеняет предыдущее объявление. Это означает, что это целая новая переменная и не коррелирует с предыдущей.

var x = 2; 
 

 
function useGlobal() { 
 
    // No x is declared here so it grabs the next available x value 
 
    // which is the global one 
 
    console.log(x); 
 
} 
 

 
function hideX(x) { 
 
    // Here we've said that the function takes a parameter named x 
 
    // This means we can no longer access the outer variable named x 
 
    console.log(x); // undefined 
 
} 
 

 
function declareX() { 
 
    // Same thing as before, we've declared a new x so the old 
 
    // one is shadowed 
 
    var x = 500; 
 
    console.log(x); 
 
} 
 

 
useGlobal(); 
 
hideX(); 
 
declareX(); 
 

 
// Notice how declareX didn't change the original x 
 
useGlobal();