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

したがって、私が知る限り、createFunctionWithPropertyfunctionWithPropertyはJavaScript コードが実行される前に巻き上げられ、解析され、存在する関数宣言です。ただし、ある時点で、createFunctionWithProperty関数を呼び出している間functionWithProperty、クロージャーになりfunctionWithPropertyます。これは、インスタンスごとに異なる独自のプロパティと変数を持つ関数の非常に特定のインスタンスです。それはすべて理論上ですが、この場合、物事がどのように機能するかわかりません。いつ、どのように正確functionWithPropertyに閉鎖になるかについて、詳細な内訳を誰かが教えてくれますか? ありがとうございました。

4

2 に答える 2

2

この場合、それがクロージャーは言うまでもなく関数であるかどうかは問題ではありません。

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

var a = createObjectWithProperty(123);
var b = createObjectWithProperty(321);
alert(a.property + " : " + b.property); 
于 2013-11-11T21:07:43.437 に答える
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() {}はどちらも関数を宣言する方法ですが、一方は巻き上げられ、もう一方は巻き上げられないことがわかります。これらの関数は両方ともクロージャーとして機能しますが、この例では、なぜそれらがクロージャーとして機能するのか、または JavaScript のクロージャーに関連する利点や落とし穴の良い例を実際には示していません。

編集:これは、関数がjavascriptのファーストクラスオブジェクトである(ほとんど)ことの良い例でもあると思います。他の言語とは異なり、javascript では関数にプロパティを割り当てることができます。「閉鎖」と言って、それを理解しようとしているのかもしれません。

于 2013-11-11T21:14:09.550 に答える