Почему при вызове метода из анонимной функции это объект, а прямой вызов выдает ошибку - PullRequest
3 голосов
/ 20 января 2012

со следующим:

function Person() {
    this.name = "john";
    this.getName = function() {
        return this.name;
    };
}

var me = new Person();

С чего бы это было:

setTimeout(function(){alert(me.getName())}, 3000);

возвращает john во время процедуры:

setTimeout(me.getName(), 3000);

создать

Uncaught TypeError: Object [object DOMWindow] has no method 'getName' 

Ответы [ 3 ]

3 голосов
/ 20 января 2012

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

В вашем фрагменте кода:

setTimeout (function () {alert (me.getName ())}, 3000);

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

Во втором фрагменте, который вы передаете результат вызова функции , поэтому:

setTimeout (me.getName (), 3000);

Становится так:

setTimeout ('john ', 3000);

Благодаря тому, как работает setTimeout, он позволит вам передать строку в качестве первого аргумента, который среда выполнения попытается вызвать как функцию, что приведет к ошибке.

2 голосов
/ 20 января 2012

Вы уверены, что это код, который вы использовали?setTimeout(me.getName(), 3000) вызывает me.getName, а затем передает результат в качестве первого аргумента setTimeout.

Если вы имели в виду setTimeout(me.getName, 3000), это потому, что функция не связана с me, поэтому setTimeoutвыполняет ее в контексте window (откуда она взяла бы me? Вы только передали саму функцию).

Вместо помещения вызова внутри анонимной функции, вы можете использовать bind:

setTimeout (me.getName.bind (me), 3000);

Это недоступно в старых браузерах, но страница MDN имеет запасную реализацию.

1 голос
/ 20 января 2012

Вы пометили вопрос с правильным ответом: замыкания.Когда вы оборачиваете код в анонимную функцию, вы создаете замыкание, которое захватывает значение локальной переменной, называемой мной.

Как отметил Джеймс, часть вопроса, которая не работает, немного странная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...