Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Захват переменных функцией (https://javascript.ru/forum/misc/46511-zakhvat-peremennykh-funkciejj.html)

ruzik 12.04.2014 19:05

Захват переменных функцией
 
Здравствуйте, у меня есть код:
var funcNameArray = ["sin", "cos", "tan", "asin", "acos", "atan", "atan2", "cot", "sec", "csc"];

    //Create shell
    for (var i in funcNameArray) {

        var funcName = funcNameArray[i], obj = {};
        var func = math[funcName];

        obj[funcName] = function (x) {
            return func(GetRadAngle(x));
        };

        math.import(obj, { override: true });
    };


Он последовательно переопределяет математические функции в мат библиотеке math.js(может это поможет). И вся проблема в том, что все функции в результате указывают на одну анонимную, а она в свою очередь использует func, которая как я понял оказалась одна на всех. Как это можно исправить?

nerv_ 12.04.2014 19:09

Что требуется? Ничего не понял :)
Зачем переопределять все функции?

Erolast 12.04.2014 21:04

http://javascript.ru/basic/closure#p...-ispolzovaniya

ruzik 12.04.2014 21:50

Цитата:

Сообщение от Erolast (Сообщение 307448)

Здравствуйте, это как раз то, что было нужно, судя по описанию.
Правда я видимо чего-то все же не понял, раз результат получился такой же:
var funcNameArray = ["sin", "cos", "tan", "asin", "acos", "atan", "atan2", "cot", "sec", "csc"];

    //Create shell
    for (var i in funcNameArray) {
        var funcName = funcNameArray[i], obj = {};
        var func = math[funcName];

        obj[funcName] = function (x) {
            return (function () {
                return func(GetRadAngle(x));
            })(x);
        };

        math.import(obj, { override: true });
    };

ruzik 12.04.2014 21:51

Цитата:

Сообщение от nerv_ (Сообщение 307425)
Что требуется? Ничего не понял :)
Зачем переопределять все функции?

В math.js просто нет возможности задавать режим углов для тригонометрических функций в настройках и тд, максимум sin(60 deg) написать, вот и решил написать свою оболочку, которая со всем этим работает)

Octane 12.04.2014 22:06

for (var i in funcNameArray) {
	var funcName = funcNameArray[i], obj = {};

	obj[funcName] = function () {
		var func = math[funcName];
		return function (x) {
			return func(GetRadAngle(x));
		};
	}();

	math.import(obj, { override: true });
};


но лучше так
funcNameArray.forEach(function (funcName) {
	var obj = {};
	obj[funcName] = function (x) {
		return math[funcName](GetRadAngle(x));
	};
	math.import(obj, { override: true });
});

ruzik 12.04.2014 22:13

Спасибо, работает!


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