2015-04-22 5 views
0

Вот код и fiddle:Как получить значение от анонимной функции?

var test = function(){ 
    return{ 
     value: "hi", 
     func1: function(){ 
      func2(); 
     }() 
    }; 
}(); 

function func2(){ 
    alert(test.value); 
} 

Может кто-нибудь сказать мне, что я сделал не так? Я не могу получить test.value.

+0

вы не прошли тест на ваш второй функции func2() использует в другой области, поэтому вам нужно передать переменную в нее – MuppetGrinder

ответ

1

Ваш func2() вызывается из IIFE для func1 собственности в IIFE, что строит объект, который будет назначен test. Прежде чем назначить test. И он пытается получить доступ к свойству test.value, по переменной, которая еще undefined, и выбрасывает ReferenceError. (Смотрите также Self-references in object literal declarations)

Я думаю, что вы ищете

var test = function(){ 
    return{ 
     value: "hi", 
     func1: function(){ 
      func2(); 
     } // <-- no invocation here, make `func1` a method not `undefined` 
    }; 
}(); 

function func2(){ 
    alert(test.value); 
} 

test.func1(); // "hi" 

updated fiddle()

+0

super, и я искал некоторую информацию о IIFE. Я получил много, thx! – nich

+0

Я должен был связать это ... – Bergi

0

Если запустить этот код, который вы будете получать undefined. Зачем? Хорошо, потому что вы не дали достаточно времени для своего test на самом деле инициировать себя (и то, что вы делаете это синхронно).

Попробуйте асинхронный решение.

var test = function(){ 
    return{ 
     value: "hi", 
     func1: function(){ 
      setTimeout(function(){ func2(); }, 50); 
      //you can also just do 
      //setTimeout(func2, 50); 
     }() 
    }; 
}(); 

function func2(){ 
    alert(test.value); 
} 

Demo

заметить также, что вы ничего не вернуться к func1, так как она сама по себе авто invoques. Позже, если вы попытаетесь сделать test.func1(), это не сработает.

0

Проблема в том, что вы назначаете литерал объекта test. Однако, чтобы построить этот объект, вы вызываете func2. Эта функция пытается получить доступ к test, но в этот момент она все еще не определена.

Таким образом, вы должны вызвать func2 после назначения объекта test:

var test = function(){ 
    return { 
     value: "hi", 
    }; 
}(); 
test.func1 = function(){ 
    func2(); 
}(); 
function func2(){ 
    alert(test.value); 
} 

Однако, обратите внимание, что это немного странно, потому что анонимная функция не возвращает никакого значения. func2(); test.func1 = undefined было бы более естественным.

0

Как упоминал Берги, вы хотите использовать Imidiatelly Invoked Function Expression (IIFE), но ваш синтаксис неверен.

см fixed fiddle

var test = (function(){ 
    return{ 
     value: "hi", 
     func1: function(){ 
      func2(); 
     } 
    }; 
})(); 

function func2(){ 
    alert(test.value); 
} 

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

Смежные вопросы