Вставить вопрос о функции - PullRequest
0 голосов
/ 18 декабря 2010

например:

//global vars
var g1,g2,g3;
function a(p1,p2,p3){
  //local vars
  var a1,a2,a3;
  return function(){
    //an embed function, looks like dynamic defined at runtime
  }
}

var f1 = a(1,2,3)
var f2 = a(4,5,6)
f1()
f2()

У меня вопрос: f1 и f2 указывают на один и тот же код в памяти, почему они выполняют разные функции? функция тратит время на создание функции встраивания при каждом вызове a?

и GC работает также очень интересно, локальные переменные a не будут GC после выполненного, это должно быть GC после возвращенной функции встраивания GCed, причина возвращенной функции embed все еще может вызывать локальные переменные функции a.

Ответы [ 3 ]

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

Чтобы ответить на ваши вопросы:

  1. Нет, они указывают на разные функции
  2. Конечно, создание новых функций займет немного времени
  3. Это потому, что возвращаемые функции являются замыканиями и могут ссылаться на область, в которой они были созданы.

Разница между оператором функции и выражением

function foo() {} // created at compile time, is available every in the code from the start

var foo = function() {}; // created at runtime, only is available after it's creation
                         // while foo already exists it's set to undefined

function test() {
    return function(){}; // returns a new function each time test is called
}

Затворы

function test() {
    var b = 123;

    // this function inherits all outer scopes so it still has access to b
    return function() {
        console.log(b); //
    };
}

Подробнее о замыканиях см. Этот вопрос и ответы.

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

мой вопрос: f1 и f2 указывают на один и тот же код в памяти, почему они сшивают разностную функцию?

Они не указывают на одну и ту же функцию.

неужели функция тратит время на создание функции встраивания при каждом вызове a?

Да, каждый раз, когда вы вызываете функцию a, новая внутренняя функция будетсоздан и возвращен.

и GC также работает очень интересно, локальные переменные a не будут GC после выполненного, это должен быть GC после возвращенной функции встраивания GCed, причина возвращенной функции встраивания все ещевызовите локальные переменные функции a.

Да, это называется закрытием.Внутренняя функция имеет доступ ко всем переменным среды выполнения, в которой она была создана.

0 голосов
/ 18 декабря 2010

Как вы упомянули, встроенные функции имеют доступ к локальным переменным. Это называется замыканием .

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