Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прочитать агрументы из замыкания (https://javascript.ru/forum/misc/76598-prochitat-agrumenty-iz-zamykaniya.html)

RuBrain 25.01.2019 12:22

Прочитать агрументы из замыкания
 
Всем привет.

Подскажите, как прочитать arguments функции secondFunс? Напрямую понятно можно обратиться, а если будет передано неизвестное кол-во аргументов, как перебрать их?

function secondFunc(a, b) {
    return function(c, d){
        for( let i=0; i<arguments.length; i++ ){
            console.log(arguments[i]);
        }
        return a + b + c + d;
    }
}

function mainFunc(second) {
    return second(1,2);
}
console.log( mainFunc( secondFunc(3,5) ) );

Nexus 25.01.2019 12:56

RuBrain, вы в своем коде разве не получаете все переданные аргументы в функцию(4-я строка)?
В чем вопрос?

ksa 25.01.2019 13:38

Цитата:

Сообщение от RuBrain
как прочитать arguments функции secondFunс?

Например записать их в другой массив...
function secondFunc(a, b) {
	var prm=[];
	for( let i=0; i<arguments.length; i++ ){
		prm[i]=arguments[i]
	};
    return function(c, d){
        for( let i=0; i<prm.length; i++ ){
            alert(prm[i]);
        }
        return a + b + c + d;
    }
}

function mainFunc(second) {
    return second(1,2);
}
alert( mainFunc( secondFunc(3,5) ) );

RuBrain 25.01.2019 13:55

Понятно, т.е. никакого объекта нету посмотреть наружу.

ksa 25.01.2019 13:59

Цитата:

Сообщение от RuBrain
т.е. никакого объекта нету посмотреть наружу

Не совсем понятное высказывание... :blink:

Тебе нужно не известно что... У функции для этого есть специальный объект - arguments. Ты его хочешь видеть внутри еще одной функции, у которой есть свой arguments...
Ясное дело, что "первый" arguments нужно "скопировать" в другой массив или объект. Дабы не упоминать arguments в суе. :D

Какой тебе еще "специальный" объект нужен?

Malleys 25.01.2019 15:24

Цитата:

Сообщение от RuBrain
Подскажите, как прочитать arguments функции secondFunс? Напрямую понятно можно обратиться, а если будет передано неизвестное кол-во аргументов, как перебрать их?

function secondFunc(...args) {
	return function(){
		const allArgs = [...arguments, ...args];
		console.log(allArgs);

		return allArgs.reduce((m, v) => m + v, 0);
	}
}

function mainFunc(second) {
	return second(1,2);
}
console.log(mainFunc(secondFunc(3,5)));


Цитата:

Сообщение от RuBrain
Понятно, т.е. никакого объекта нету посмотреть наружу.

Вы можете присвоить объект arguments от secondFunc и смотреть где угодно!
function secondFunc() {
	const args = arguments;

	return function(){
		const allArgs = [...arguments, ...args];
		console.log(arguments);
		console.log(args);

		return allArgs.reduce((m, v) => m + v, 0);
	}
}

function mainFunc(second) {
	return second(1,2);
}
console.log(mainFunc(secondFunc(3,5)));

MallSerg 25.01.2019 16:08

Цитата:

Сообщение от ksa
Сообщение от RuBrain
т.е. никакого объекта нету посмотреть наружу
Не совсем понятное высказывание...

Он хочет явным образом получить текущий [[scope]] как объект. а так же цепочку вышестоящих [[scope]].
Такого в JS никогда не будет. В разы ухудшится быстродействие увеличится затраты по памяти за сомнительный плюс ссылки на [[scope]] на каждую смену области видимости(вызов функции).


Часовой пояс GMT +3, время: 23:46.