Почему функция Javascript при инстанцировании действует иначе, чем при выполнении? - PullRequest
2 голосов
/ 16 декабря 2010

Я пришел из C # / PHP и пытаюсь понять идею Javascript о том, что функции являются переменными / объектами и имеют квази-конструкторы и т. Д.

Может кто-нибудь объяснить, почему следующий код функционирует так, как она именно:

  1. Почему при создании переменной / функции не отображается «2» test?
  2. Почему при выполнении переменной / функции не отображается «1»test?

код:

var setup = function () {
    console.log(1);
    return function() {
        console.log(2);
    };
};

var test = setup(); // 1
test(); // 2
test(); // 2
test(); // 2

добавлено:

Спасибо @thejh @Justin за то, что функция возвращает совершенно другую функцию это не имеет ничего общего с первой (я думал о второй функции как о неком конструкторе первой), если я закомментирую это, то будет понятнее:

$(document).ready(function() {

    var setup = function () {
        console.log(1);
//        return function() {
//            console.log(2);
//        };
    };

    var test = setup(); // 1
    test(); // "test is not a function"
    test(); // "test is not a function"
    test(); // "test is not a function"

});

Ответы [ 6 ]

5 голосов
/ 16 декабря 2010

Вы звоните только setup() в первый раз.После вызова новой возвращаемой функции присваивается значение test.С этого момента вы вызываете эту новую функцию:

// calls setup which logs 1 and returns a new function.
// setup also returns a new function and assigns that new function to test.
var test = setup(); 

// test now is the equivalent of var test = function(){ console.log(2); };

// call the new function that setup returned which logs 2
test();

// and again
test();

// and again
test();
5 голосов
/ 16 декабря 2010

Поскольку вы возвращаете функцию , отличную от той, которая вызывается при ее создании (та, что в return, которую вы не вызываете в первой строке) ... это то, что выполняется на других вызовах.Например, это даст вам 1 затем 2:

var test = setup()(); // 1, 2

Вы можете проверить это здесь .

1 голос
/ 16 декабря 2010

Здравствуйте, когда вы делаете setup(), вы выполняете следующие две строки:

console.log(1);
function() { console.log(2); }
  • первая строка журнала "1"
  • вторая строка ничего не регистрируетпоскольку функция не вызывается, она только создает объект (а этот объект является функцией).

когда вы делаете test(), вы фактически вызываете созданную вами функцию и таким образом вы регистрируете"2"

JS - это функциональный язык, вы должны видеть такие функции, как объект первого гражданина.

1 голос
/ 16 декабря 2010

Представьте себе вместо

var setup = function () {
    console.log(1);
    return function() {
        console.log(2);
    }
}

этот эквивалент Синтаксис ООП

var setup = new Function("\
    console.log(1);\
    return new Function(\"\
        console.log(2);\
    \");\
");
var test = setup(); // 1
test(); // 2
test(); // 2
test(); // 2

Я думаю, вам сейчас должно быть что-то более знакомое.

1 голос
/ 16 декабря 2010

Вызов setup() печатает 1 и возвращает ссылку на эту анонимную функцию. Звонок, который печатает 2.

1 голос
/ 16 декабря 2010

При первом назначении теста для setup () вы выполняете всю функцию, поэтому console.log(1) запускается, а затем возвращает новую функцию.

Теперь вы присваиваете возвращаемое значениеэта первая функция будет следующей функцией, которая запускает console.log(2), поэтому теперь тестируйте ссылки, которые вернули функцию.

Ваши последующие вызовы просто запускают ту функцию, которая выполняет console.log(2)

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