Оценка рекурсивного утверждения [дубликат]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

36
задан MatthewJ 29 September 2009 в 16:55
поделиться

8 ответов

Простым способом создания круговой ссылки является наличие объекта, который ссылается на себя в свойстве:

function Foo() {
  this.abc = "Hello";
  this.circular = this;
}

var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);

Здесь объект foo содержит ссылку на себя.

С закрытием это обычно более неявное, просто имея круговую ссылку в области видимости, а не как явное свойство некоторого объекта:

var circular;

circular = function(arg) {
  if (arg) {
    alert(arg);
  }
  else {
    // refers to the |circular| variable, and by that to itself.
    circular("No argument");
  }
}

circular("hello");
circular();

Здесь функция, сохраненная в circular, относится к circular и, тем самым, к себе. Он неявно содержит ссылку на себя, создавая круговую ссылку. Даже если circular теперь выходит за пределы области действия, он по-прежнему ссылается на область функций. Простые сборщики мусора не распознают этот цикл и не собирают функцию.

47
ответ дан sth 5 September 2018 в 07:15
поделиться

Или даже проще, массив «содержащий» сам. См. Пример:

var arr = [];
arr[0] = arr;
14
ответ дан Alan Kis 5 September 2018 в 07:15
поделиться

Или используя ES6:

class Circular {
  constructor() {
    this.value = "Hello World";
    this.self = this;
  }
}

circular = new Circular();
2
ответ дан codeepic 5 September 2018 в 07:15
поделиться

Вероятно, самый короткий способ определить циклический объект.

a = {}; a.a = a;
9
ответ дан cychoi 5 September 2018 в 07:15
поделиться
window.onload = function() {
  hookup(document.getElementById('menu'));

  function hookup(elem) {
    elem.attachEvent( "onmouseover", mouse);

    function mouse() {
    }
  }
}

Как вы можете видеть, обработчик вложен в attacher, что означает, что он закрыт над областью вызова.

11
ответ дан Josh Stodola 5 September 2018 в 07:15
поделиться
function circular(arg){
    var count = 0;

    function next(arg){
        count++;
        if(count > 10) return;
        if(arg){
            console.log('hava arg: ' + arg);
            next();
        }else{
            console.log('no arg');
            next('add');
        }
    }
    next();
}
circular();

Циркуляр и с закрытием.

1
ответ дан Liucw 5 September 2018 в 07:15
поделиться
var b = [];
var a = [];
a[0] = b;
b[0] = a;

Печать a или b вернет Circular.

1
ответ дан Prasad Jadhav 5 September 2018 в 07:15
поделиться

Вы можете сделать:

  • window.window...window
  • var circle = {}; circle.circle = circle;
  • var circle = []; circle[0] = circle; or circle.push(circle)
  • function Circle(){this.self = this}; var circle = new Circle()
2
ответ дан Thomas Smith 5 September 2018 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: