2013-11-11 4 views
0
function createFunctionWithProperty(property) { 
    functionWithProperty.property = property; 
    return functionWithProperty; 
    function functionWithProperty() { 
    } 
} 

var a = createFunctionWithProperty(123); 
var b = createFunctionWithProperty(321); 
alert(a.property + " : " + b.property); // 123 : 321 

Так, насколько я знаю, как createFunctionWithProperty и functionWithProperty являются объявления функций, которые поднимаются, разобранная и принесенное в существование до выполнения любого кода JavaScript выполняются. Однако в какой-то момент при вызове функции createFunctionWithPropertyfunctionWithProperty становится замыканием, то есть очень конкретным экземпляром функции functionWithProperty со своими собственными свойствами и переменными, которые закрываются по сравнению с разными для каждого экземпляра. Это все в теории, но в этом случае я не понимаю, как все работает. Кто-нибудь даст подробный отрыв о том, когда и как точно functionWithProperty станет закрытием. Спасибо.Как работают затворы в этом конкретном случае?

+1

Этот вопрос кажется не по теме, потому что он не связан с закрытием. – Mathletics

+0

@Mathletics, о чем это? –

ответ

2

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

function createObjectWithProperty(property) { 
    var objectWithProperty = {}; 
    objectWithProperty.property = property; 
    return objectWithProperty; 
} 

var a = createObjectWithProperty(123); 
var b = createObjectWithProperty(321); 
alert(a.property + " : " + b.property); 
+1

@ War10ck вы неправильно читаете; свойство на самом деле называется 'property'. – Mathletics

+1

Извините, моя ошибка. – War10ck

+0

, но в вашем примере я четко вижу, где экземпляр объекта «objectWithProperty» (строка с «var objectWithProperty = {}')! в моем случае с funciton это совсем не ясно –

2

Этот пример кода, который вы размещены как выглядит это иллюстрирующих Подъемно и не закрытие. Если вы меняете:

function createFunctionWithProperty(property) { 
    functionWithProperty.property = property; 
    return functionWithProperty; 
    function functionWithProperty() { 
    } 
} 

к:

function createFunctionWithProperty(property) { 
    functionWithProperty.property = property; 
    return functionWithProperty; 
    var functionWithProperty = function() { 
    } 
} 

Вы увидите, что хотя var functionWithProperty = function() {} и function functionWithProperty() {} оба способа объявить функцию, один будет поднят, а другой не будет. Хотя обе эти функции действуют как замыкания, этот пример на самом деле не дает хорошего примера того, почему они действуют как замыкания, или преимущества или gotchas, связанные с закрытием в javascript.

Редактировать: Я полагаю, что это также отличный пример того, как функции являются объектами первого класса в javascript (в основном). В отличие от других языков, javascript позволяет присваивать свойства функциям. Возможно, это то, что вы пытаетесь понять, говоря «закрытие».

+0

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

+2

Подъемные функции не замыкаются. Это 2 совершенно разные идеи в программировании javascript. Закрытие - это идея, что функция внутри другой функции будет иметь доступ ко всем переменным внешней функции. Подъем - это странная вещь в javascript, где независимо от того, где внутри функции вы определяете переменную, javascript будет внутренне определять ее в верхней части функции. Вот почему вы можете определить 'functionWithProperty.property', даже если' function functionWithProperty() {} 'обычно НИКОГДА не запускается, потому что это после оператора return. – MattDiamant

+2

Обновленный мой комментарий выше, чтобы объяснить.Редактировать: Кроме того, ваш комментарий выше о «воображаемой строке» является точным на правильном :) – MattDiamant

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