2010-12-10 40 views

cevap

15

Sen ... buna

var a = function() { 

    var b = function() { 
     // I'm private! 
     alert('go away!'); 
    }; 

    return { 
     b: b // Not anymore! 
    }; 

}; 

See it on jsFiddle bir başvuru döndürebilir. Ayrıca, bind it to the window object da olabilir. Ancak yukarıdaki yöntemi tercih ediyorum, aksi halde global bir değişkenle (window nesnesinin bir özelliği) gösteriliyorsunuz.

+0

+1. OP, bu e-kitaba bir göz atmalısınız: http://addyosmani.com/blog/essentialjsdesignpatterns/. Bu "Revizyon Modülü" deseni olarak bilinir. – simshaun

+0

Teşekkürler, anonim bir işlevi varsa aynı şekilde açığa çıkarabilir miyiz? – paul

+0

@paul Evet, 'dönüş işlevi() {}'. – alex

7

Bir şekilde dışarıya geçirmeniz gerekir.

Örnek:http://jsfiddle.net/patrick_dw/T9vnn/1/

function someFunc() { 

    var privateFunc = function() { 
     alert('expose me!'); 
    } 

    // Method 1: Directly assign it to an outer scope 
    window.exposed = privateFunc; 

    // Method 2: pass it out as a function argument 
    someOuterFunction(privateFunc); 

    // Method 3: return it 
    return privateFunc; 
} 

someFunc()(); // alerts "expose me!" 

function someOuterFunction(fn) { 
    fn(); // alerts "expose me!" 
} 

window.exposed(); // alerts "expose me!" 
+0

+1 olmadan bence bir tane hak ediyor :) – alex

+0

penceresi, global bir nesnedir. Bir yöntemi açıklamak için global bir nesneyi kullanmanın iyi bir yolu var mı? – paul

+0

@paul - @alex ile aynı fikirdeyim ve hayır de. Bunu genel bir örnek olarak kullandım. Erişime sahip olduğunuz tüm kapsamlara atayabilirsiniz. – user113716

3

dahili olarak içinde (çağırma bağlı olarak değişebilir) bu kapsamını onları bildirerek fonksiyonları ya da bir kapak özelliklerini açığa.

function example(val) { 

    var value = val; 

    this.getVal = function() { 
     return value; 
    } 

    this.setVal = function(v) { 
     value = v; 
    } 
} 

var ex = new example(2); 
ex.getVal(); // == 2 
ex.setVal(4); // == null 
ex.getVal(); // == 4 

Yöntemleri ilan Var kullanarak değişkenleri erişebilir bu beyan değil, başka bir yol 'yuvarlak.

function example(val) { 

    var value = val; 

    var double = function(v) { 
     return 2 * v; 
    } 

    this.getDouble = function() { 
     return double(value); 
    } 
} 


var ex = new example(2); 
ex.getDouble(); // == 4 

fonksiyonu kapsamı üzerinde kapanır. Yapmak istediğiniz şey, ihtiyacınız olan kapsama erişimi olan bir işleve bir başvuru göndermektir, böylece daha sonra bir noktada onu çağırırsınız.

Eğer daha ileri noktada belirli bir yöntemini çağıran bir işlev oluşturmanız gerekiyorsa,

kapsam sorunu ise
var ex = new example(2); 
var delayed_call = function() { 
    return(ex.getDouble()); // == 4, when called 
} 
setTimeout(delayed_call, 1000); 

,

var ex = new example(2); 
var delayed_call = (function(ex_ref) { 
    return function() { 
     return(ex_ref.getDouble()); // == 4, when called 
    } 
})(ex); // create a new scope and capture a reference to ex as ex_ref 
setTimeout(delayed_call, 1000); 

Daha az ile bunun en satır içine alabilirsiniz okunabilir, örneğin,

setTimeout((function(ex_ref) { 
    return function() { 
     return(ex_ref.getDouble()); // == 4, when called 
    })(new example(2))) 
    , 1000 
); 

setTimeout, yeni kapsamda yürütmeyi göstermek için uygun bir yoldur.

var ex = new example(2); 
var delayed_call = function() { 
    return(ex.getDouble()); 
} 
delayed_call(); // == 4 
+0

Teşekkürler! ... açıklama için ... – paul

0

performans amaçları için bunu bu şekilde çağırabilir:

var a = (function(){ 
    function _a(){} 
    _a.prototype = (function(){ 
    var _test = function(){ console.log("test"); }; 
    return { 
     test: _test 
    } 
    }()); 

    return new _a(); 
}()); 

// usage 
var x = a; 
x.test(); // "test" 
İlgili konular