Bir kapağın içinde bir yöntem oluştururken, bu kapama için özel hale gelir ve bir şekilde ortaya çıkana kadar erişilemez.Bir kapağın içinde bulunan bir yöntem gösteriliyor
Nasıl ortaya çıkabilir?
Bir kapağın içinde bir yöntem oluştururken, bu kapama için özel hale gelir ve bir şekilde ortaya çıkana kadar erişilemez.Bir kapağın içinde bulunan bir yöntem gösteriliyor
Nasıl ortaya çıkabilir?
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.
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!"
+1 olmadan bence bir tane hak ediyor :) – alex
penceresi, global bir nesnedir. Bir yöntemi açıklamak için global bir nesneyi kullanmanın iyi bir yolu var mı? – paul
@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
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 isevar 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
Teşekkürler! ... açıklama için ... – paul
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"
+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
Teşekkürler, anonim bir işlevi varsa aynı şekilde açığa çıkarabilir miyiz? – paul
@paul Evet, 'dönüş işlevi() {}'. – alex