2016-01-02 4 views
1

Я продолжаю пытаться назначить функцию переменной, и я продолжаю получать сообщение о том, что foo не является функцией. Я не знаю, почему это так. Когда я вызываю метод сам по себе, он работает, но когда я назначу его переменной, он не будет работать.Почему я не могу назначить функцию переменной с использованием прототипа?

Может кто-нибудь, пожалуйста, помогите мне понять это? Спасибо!!!

Ниже мой код:

function Test(){ 

    function foo(){ 
     return "foo"; 
    } 

    this.bar = function() { 
     var foo = foo(); 
     console.log(foo); 
    }; 
} 
var test = new Test(); 
test.bar(); 

ответ

2

Следующий код будет работать. Как сейчас, мы не пытаемся присвоить переменную такую ​​же переменную функции.

Проблема заключается в том, что JavaScript является областью действия. Он терпит неудачу, потому что функция this.bar попытается оценить foo first, а foo - имя переменной в этой функции, поэтому интерпретатор попытается выполнить foo, но foo является переменной в этой области, он не будет рассматривать foo, упомянутый выше. Поэтому он терпит неудачу.

Где, как foo1, будет работать, потому что когда интерпретатор попадает в термин foo1, он будет искать текущую область действия и все родительские области, и она получит ее.

function Test(){ 

function foo1(){ 

    return "foo"; 
} 


this.bar = function() { 

    var foo = foo1(); 

    console.log(foo); 

}; 

} 


var test = new Test(); 
test.bar(); 
+0

Спасибо большое! Теперь я понимаю, почему он не работал – json2023

5

Виновник эта линия var foo = foo();. Оператор var foo обновляет локальную переменную foo. К тому времени, когда вы попытаетесь получить к нему доступ с foo(), он стал переменной undefined.

Переименуйте переменную или функцию, и все работает правильно.

0

Ошибка в этой строке

var foo = foo(); 

Ваша переменная foo имеет то же имя, что и функция, которая скрывает функцию снаружи.

Переименование устраняет ошибку.

var foo1 = foo(); 
0

Там ошибки вы видите из этой строки:

var foo = foo(); 

При использовании var есть вы говорите, что foo в настоящее время определяется для текущего уровня охвата (this.bar) - означает, что она не будет пузыряться до Test. Вы можете переименовать переменную на что-то другое:

var result = foo(); 
console.log(result); 

или просто отказаться от этой переменной в целом, как это:

console.log(foo()); 

совершенно ваш выбор.

0

Если вы учитесь, как создавать и работать с объектами JavaScript, вы можете переписать код следующим образом:

// This function constructs the object when called with new 
function Test(prop) { 
    // Some arbitrary property 
    if (typeof prop === "undefined") { 
     prop = null; 
    } 
    this.prop = prop; 
} 

// The two functions 
Test.prototype.foo = function() { 
    return "foo"; 
} 

Test.prototype.bar = function() { 
    var foo = this.foo(); 
    console.log(foo); 
} 

// Create the object and call foo 
var test = new Test('p'); 
test.bar(); 

объектов Всех JavaScript наследуют свойства и методы от их прототипа. Объекты, созданные с использованием объектного литерала, или с помощью нового объекта Object(), наследуемого от прототипа под названием Object.опытный образец. Объекты , созданные с новой Date(), наследуют Date.prototype. Объект Object.prototype находится на вершине прототипа.

От: http://www.w3schools.com/js/js_object_prototypes.asp

+0

Спасибо за ответ! Я не пытаюсь узнать, как использовать javascript. Я просто переписал простой в использовании, отрезанный от рабочего кода, который у меня уже есть. Но спасибо за объяснение! – json2023