2013-06-12 4 views
0

Как передать переменную в одну функцию, а затем вернуть значение другой функции? У меня есть простой пример здесь, где я пытаюсь это выработать. Первая функция принимает аргумент 'currpage', возвращает его ко второй функции правильно как число, но затем, когда я вызываю вторую функцию, console.log показывает NaN. Не уверен, что я могу делать неправильно.Возвращаемое значение функции

$(document).ready(function() { 

    var currpage = 1; 

    $('p').click(function() { 
     var xyz = passfrom(currpage); //pass var to function and return value 
     console.log(xyz); //returns correct value 

     var abc = passto(); 
     console.log(abc); //NaN 
    }) 
}) 

function passfrom(currpage) { 
    var newpage = parseInt(currpage) * 1000; 
    return newpage; 
} 

function passto() { 
    var newcurr = passfrom(); 
    var newcurr = newcurr * 1000; 
    console.log(typeof (newcurr)); //number 
    return newcurr; 
} 
+0

'typeof NaN' - это номер' ', вы должны знать. И нет необходимости во втором «var» во втором «var newcurr». Во всяком случае: 'passto()' возвращает 'NaN'. –

+2

Вы ничего не передадите passfrom() в passto(), вам нужно передать ему номер. – dandavis

+1

Это уже сказано, но я говорю это снова: 'var newcurr = passfrom();' '<-' вы не передаете значение' passfrom'. –

ответ

1

Как передать переменную одной функции, а затем вернуть значение другой функции?

Переменная - это небольшой контейнер, в котором вы храните значение. Когда вы передаете переменную функции, вы действительно передаете ей значение этой переменной. Так что в вашем случае:

passfrom(curpage); 

и

passfrom(1); 

одинаковы.

Внутри функции имена переменных используются для доступа к этим значениям. Эти имена полностью независимы от того, какое имя было привязано к значению вне функции (если оно даже имело имя). Они больше похожи на псевдонимы. Чтобы отличить их от переменных, мы называем их параметрами. Так это одно:

function passfrom(currpage) { 
    var newpage = parseInt(currpage)*1000; 
    return newpage; 
} 

и этот:

function passfrom(myownname) { 
    var newpage = parseInt(myownname)*1000; 
    return newpage; 
} 

точно так же. И если мы должны были написать, что на самом деле происходит, мы получим следующее:

// var xyz = passfrom(currpage); 
var xyz = value-of(passfrom(value-of(currpage)) 

Так все, что вам нужно сделать, чтобы передать значение некоторой функции, чтобы убедиться, что она имеет такое имя параметра доступное в которой он может использовать это значение:

function passto(myalias) { 
    console.log(myalias); 
} 

passto(xyz); // writes 1000 to the console. 

Вышеупомянутый - это фактический ответ на ваш вопрос.

Чтобы сделать вещи немного более сложным, есть еще две вещи, которые нужно принять во внимание:

  1. Scope. Имена параметров работают только внутри вашей функции. Если они не совпадают с именем переменной вне функции, эта внешняя переменная скрыта параметром. Итак:

    var currpage = 1; 
    function plusOne(currpage) { curpage += 1; } 
    plusOne(currpage); 
    console.log(currpage); // 1, as the variable currpage was hidden 
    
    function plusTwo(othername) (currpage += 2; } 
    plusTwo(currpage); 
    console.log(currpage); // 3, as currpage was not hidden 
    
  2. Это все работает для строк, целых чисел и других простых типов. Когда вы имеете дело с более сложными типами, имя параметра не является псевдонимом для значения, переданного функции, но для местоположения исходного значения. Таким образом, в этом случае, что вы делаете с параметром в функции будет автоматически происходить с переменной вне функции:

    var arr = [ 0, 1 ]; 
    function plusOne(somearr) { somearr[0] += 1; } 
    plusOne(arr); 
    console.log(arr[0]); // 1, as somearr references arr directly 
    

    Это называется «передача по значению» и «пройти по ссылке.»

+0

Да, вы ответили на мой вопрос, и спасибо за дополнительную полезную информацию. – user2232681

+0

Добро пожаловать. Я прочитал в одном из ваших других вопросов, что вы довольно новичок в программировании и самоучка, поэтому я решил, что вы получите немного дополнительной информации. В будущем, если вы займетесь другими языками программирования, вы можете иметь в виду, что все они имеют разные правила о сфере видимости и переходе по значению/ссылке. – Jer

1

Вы имеете дело с двумя различными currpage переменными, в результате чего один быть undefined при попытке выполнить арифметические действия, в результате чего NaN результата. для дальнейшего объяснения см моих комментариев рядного кода ниже:

$(document).ready(function() {  
    var currpage=1; // Local to this function, because of the var keyword. 
    ... 
}) 
}) // I'm assuming this extra closing brace and paren is a typo. 
    // Otherwise, your code example has a syntax error or is incomplete. 

function passfrom(currpage) { 
    // currpage is the name of the parameter to passfrom. 
    // It happens to have the same name as a local var in 
    // the document.ready callback above, but the two are 
    // not the same. 
    var newpage = parseInt(currpage)*1000; 
    return newpage;  
} 

function passto() { 
    // passfrom is called with an implicit 'undefined' argument. 
    // Thus, undefined will be used in the arithmetic ops and produce NaN. 
    var newcurr = passfrom(); 

    // Don't need the var keyword below. 
    var newcurr = newcurr * 1000; 
    console.log(typeof(newcurr)); //number 
    return newcurr; 
} 

Вы должны сделать то же самое currpage переменной доступна как из passfrom и passto, поместив его в более высоком/более глобальном масштабе или переместить эти функции в ту же область, что оригинальная currpage в что-то вроде этого:.

var currpage; 

$(document).ready(function() {  
    $('p').click(function() { 
     var xyz = passfrom(1); //pass var to function and return value 
     console.log(xyz); //returns correct value 

     var abc = passto(); 
     console.log(abc); //NaN 
    }) 
}) 

// Rename the param so there isn't a naming conflict. 
function passfrom(currpageParam) { 
    // If the param is a number, reset the global var. 
    if (typeof currpageParam == 'number') { currpage = currpageArg; } 

    var newpage = parseInt(currpage) * 1000; 
    return newpage; 
} 

function passto() { 
    var newcurr = passfrom(); 
    newcurr = newcurr * 1000; 
    console.log(typeof (newcurr)); //number 
    return newcurr; 
} 

Будьте осторожны. Вероятно, вы захотите предпринять шаги для защиты вашей переменной var от внешней модификации. Кроме того, я подозреваю, что есть лучший способ сделать то, что вы пытаетесь сделать, но не совсем ясно, что это такое, поэтому я ничего не могу предложить.

+0

* «Опять же, если предположить, что повторное использование newcurr - это опечатка. В противном случае это тоже неправильно. *« Это не технически неправильно, это просто не нужно. –

+0

Прохладный, он этого не знал. – FishBasketGordo

Смежные вопросы