Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обработчики циклом. (http://www.flasher.ru/forum/showthread.php?t=209153)

gloomyBrain 19.10.2014 21:47

Я о том и написал, что i должна быть примитивом, но почему-то им не является. Такие же проблемы есть в .NET (C#), только недавно пофиксили. А указателей у нас в AS3 нету, не знаю о чем вы. Равно ка и не очень понял про место хранения переменной - вы о чем?

nubideus 19.10.2014 22:55

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

Цитата:

Равно ка и не очень понял про место хранения переменной - вы о чем?
Цитата:

Всякий раз, когда начинается выполнение функции, создается ряд объектов и свойств. Во-первых, создается специальный объект с названием объект активации, который хранит параметры и все локальные переменные или функции, объявленные в теле данной функции. Напрямую обратиться к объекту активации нельзя, поскольку это внутренний механизм. Во-вторых, создается цепочка области действия, содержащая упорядоченный список объектов, для которых Flash Player или Adobe AIR проверяют объявления идентификаторов. Каждая выполняемая функция имеет цепочку области действия, хранимую во внутреннем свойстве. Для вложенных функций цепочка области действия начинается с собственного объекта активации, за которым следует объект активации родительской функции. Цепочка продолжается таким же образом, пока не будет достигнут глобальный объект. Глобальный объект создается при запуске программы ActionScript и содержит все глобальные переменные и функции.
http://help.adobe.com/ru_RU/ActionSc...0204-7f54.html

gloomyBrain 20.10.2014 00:39

Если что-то описано в документации, это вовсе не означает, что это что-то правильно. В моем понимании примитивные типы должны передаваться по значению, или хотя бы успешно имитировать подобное поведение. У Adobe свой взгляд, но подобная реализация приводит к неочевидным последствиям. Неочевидность - это, пожалуй, худшее что может случиться с API.

nubideus 20.10.2014 02:37

gloomyBrain,

тут все нормально и обычно:
Код AS3:

class A{
 var b:int = 1;
 function A(){
  b = 2;
 }
 function c(){
  trace(b);
 }
}
 
new A().c(); // 2

Код AS3:

var b:int = 1;
var c:Function = function(){
 trace(b);
};
b = 2;
 
c(); // 2

а тут омг это же магические переменные-объекты

Цитата:

Такие же проблемы есть в .NET (C#), только недавно пофиксили
точно пофиксили?
Код:

int a = 1;
Action c = () => Console.WriteLine(a);
a = 2;
c(); // 2


gloomyBrain 20.10.2014 14:04

nubideus, про C# я вот об этом.
Про AS3: я нахожу Ваши примеры идентичными. Я в своем посте описал, как в Flash Player один и тот же тип данных может передаваться как по ссылке, так и по значению, что само по себе удивительно и неочевидно.
Надеюсь, на этот раз Вы поймете мою позицию по этому вопросу.

nubideus 20.10.2014 22:54

короче, написал криво, но примерно как то так оно работает
Код AS3:

var scopeStack:Vector.<Object> = new Vector.<Object>();
 
function pushscope(scope:Object):void {
  scopeStack.push(scope);
}
 
function popscope():void{
  scopeStack.length--;
}
 
function findgetprop(prop:String):*{
  for(var i:uint = scopeStack.length - 1; i >= 0; i--){
    var scope:Object = scopeStack[i];
    if(scope.hasOwnProperty(prop)) return scope[prop];
  }
  return undefined;
}
 
//...
 
var scope:Object = {};
scope.b = 1;
pushscope(scope);
var c:Function = function():void {
  var scope:Object = {};
  pushscope(scope);
 
  trace(findgetprop("b"));
 
  popscope();
};
scope.b = 2;
c(); // 2
popscope();



Часовой пояс GMT +4, время: 16:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.