Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   как выполнить функцию в контексте локальных переменных (https://javascript.ru/forum/jquery/30520-kak-vypolnit-funkciyu-v-kontekste-lokalnykh-peremennykh.html)

vadim5june 07.08.2012 10:51

как выполнить функцию в контексте локальных переменных
 
имеем такой код
<script>
var $=6;
function f(){alert($)};
function my(){
var $=11;
f()//6
};
my();</script>


как заставить функцию f выводить 11?
что то у меня без eval не получается

mullih 07.08.2012 11:00

<script type="text/javascript">
	var $ = 6;
	function f() { alert($) };
	function my() {
		$ = 11;
		f()//6
	};
	my();
</script>


Использование локальных и глобальных переменных поможет разобраться

mullih 07.08.2012 11:04

Либо Определение функций с параметрами

какой вариант больше нравится и устраивает

<script type="text/javascript">
	var $ = 6;
	function f(v) { alert(v) };
	function my() {
		var $ = 11;
		f($);
	};
	my();
</script>

vadim5june 07.08.2012 11:14

Цитата:

Сообщение от mullih (Сообщение 195249)

Если в контексте не удастся то буду с параметрами возиться
с помощью eval получается жуткая конструкция
eval('('+f.toString()+')()')//11

mullih 07.08.2012 11:18

я же первым ответом написал пример, дело в том что вы создаете в функции my() локальну переменную, а не меняете значение глобальной

Dim@ 07.08.2012 11:23

vadim5june,
можно писать без var и она заменит глобальную переменную
var $=6;
function f(){alert($)};
function my(){
$=11;
f()//11
};
my();

vadim5june 07.08.2012 11:24

Цитата:

Сообщение от mullih (Сообщение 195254)
я же первым ответом написал пример, дело в том что вы создаете в функции my() локальну переменную, а не меняете значение глобальной

Вариант с параметрами(который понятен и очевиден) по некоторым соображениям в принципе не устраивает-поэтому и задал вопрос.

vadim5june 07.08.2012 11:25

Цитата:

Сообщение от Dim@ (Сообщение 195255)
vadim5june,
можно писать без var и она заменит глобальную переменную

Это будет уже не локальная а глобальная переменная
она будет выполнятся в контексте локальных переменных если будет объявлена внутри функции-и наверн без eval это невозможно

mullih 07.08.2012 11:36

а такой вариант?

<script type="text/javascript">
	var $ = 6;
	function my() {
		var $ = 11;
		var f = function () { alert($) }
		f();
	};
	my();
</script>

vadim5june 07.08.2012 11:41

Цитата:

Сообщение от mullih (Сообщение 195260)
а такой вариант?

если внутри объявим то выполнится как надо
с помощью eval я как раз это делаю
Это я простой пример привел-на самом деле функция очень большая и у нее много переменных которые надо выполнять в контексте локальных переменных в разных функциях
объявлять везде не получится-передавать параметрами большая морока

Deff 07.08.2012 11:46

vadim5june,
Ну а ежли все функции и констркуции обрамить в общую анонимную функцию ?

mullih 07.08.2012 11:56

<script type="text/javascript">
	var $ = 6;
	var f = function () { alert($) }
	function my() {
		var $ = 11;
		var f1 = f; //тут если есть возможность сделать копию а не ссылку передать, то должно прокатить, но я не знаю как
		f1();
	};
	my();
</script>


не уверен что есть возможность скопировать функцию, если только не извратиться, прочитать функцию в строку и потом создать заново, тогда она уже станет локальной

vadim5june 07.08.2012 11:56

Цитата:

Сообщение от Deff (Сообщение 195262)
vadim5june,
Ну а ежли все функции и констркуции обрамить в общую анонимную функцию ?

опять же мы ее должны потом везде вручную писать где потребуется вместе со всем содержимым тоже самое что везде объявлять

vadim5june 07.08.2012 12:01

Цитата:

Сообщение от mullih (Сообщение 195265)
[JS]

не уверен что есть возможность скопировать функцию, если только не извратиться, прочитать функцию в строку и потом создать заново, тогда она уже станет локальной

а потом еще выполнить получившуюся строку с помощью eval
есть еще вариант new Function

Dim@ 07.08.2012 12:06

vadim5june,у меня так катит - и с евал-ом мало мучений
var $ = 6;
function f(){alert($)};
function my(){
  var $ = 11;
  var f1 = f + "";
  eval(f1);
  f();//11
};
my();

vadim5june 07.08.2012 12:10

Цитата:

Сообщение от Dim@ (Сообщение 195272)
vadim5june,у меня так катит - и с евал-ом мало мучений

Я подозревал что без eval не обойтись-но думал по крайней мере что с eval можно усовершенствовать
-твой вариант мне нравится + :)

Dim@ 07.08.2012 12:14

vadim5june,
ну да евал нужная вещь :)


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