0

正常に動作するSlimboxをインストールしました。

ただし、Slimbox の作成者はすべての Slimbox コードをラップし、いくつかのグローバル var を設定した後、var で DOM を初期化しています。

var Slimbox = (function() {

// Global variables, accessible to Slimbox only
var win = window, ie6 = Browser.ie6, options, images, activeImage = -1, activeURL, prevImage, nextImage, compatibleOverlay, middle, centerWidth, centerHeight,

// Preload images
preload = {}, preloadPrev = new Image(), preloadNext = new Image(),

// DOM elements
overlay, center, image, sizer, prevLink, nextLink, bottomContainer, bottom, caption, number,

// Effects
fxOverlay, fxResize, fxImage, fxBottom;

// now initialize the DOM
window.addEvent('domready', function() {

// *************
// This is where the problem arises. 
// I call ajax actions here, and some functions which are external to 'domready' 
// *************
pageInit();
setupFormSubmit('product_bid', 'afterPlaceBid');
setupAjaxAction('delete_validate_id_link', 'afterDelete');
setupAjaxAction('move_validate_down_link', 'afterMoveValidate');
//etc...

});
// end the DOM function



function afterMoveValidate(){  
}

function afterDelete() { 
}

// all the Slimbox functions are here too... 
etc..

//end the var Slimbox
})

問題は、まだ var にある間、私の外部関数がグローバル スコープを持っていないのに、Slimbox 関数がグローバル スコープを持っていることです。

これは、DOM を初期化し、外部関数を持っていた Slimbox がなくても機能しました。

誰でもアイデア/説明を手伝ってもらえますか?

ありがとう

4

1 に答える 1

0

Slimboxの作者が行ったことは、モデルパターンを実装したものです。以下のコードをテストすると、外部からアクセスprivateVarできないことに気付くでしょう。ただし、および`publicFunctionprivateFunctionを介してそれらにアクセスできます。publicVar

したがって、slimbox関数(または以下のmodelPattern)に配置されたものすべてに外部からアクセスすることはできず、返されるオブジェクトに「エクスポート」された部分のみにアクセスできます。その部分だけが「slimbox」変数(または以下のmodelPattern)に含まれるためです。

var modelPattern = (function() {

    // Global variables, accessible to Slimbox only
    var privateVar = 'private';

    function privateFunction() {
        console.log(privateVar);
    }

    return {
        publicVar: 'public',
        publicFunction: function() {
            console.log(privateVar);
        }
    };
})();

modelPattern.publicFunction();
if (!modelPattern.privateFunction) {
    console.log("privateFunction is not defined");
}​

このフィドルでコードの結果を確認できます。出力を確認できるように、JavaScriptコンソールを起動するだけです。http://jsfiddle.net/ArE2x/

于 2012-11-13T21:32:10.610 に答える