当我们在闭包内创建一个方法时,它变成了该闭包的私有,并且在我们以某种方式公开它之前无法访问它。
怎么暴露?
答案 0 :(得分:15)
您可以返回对它的引用......
var a = function() {
var b = function() {
// I'm private!
alert('go away!');
};
return {
b: b // Not anymore!
};
};
你也可以bind it to the window
object。但我更喜欢上面的方法,否则你通过全局变量(作为window
对象的属性)公开它。
答案 1 :(得分:7)
你需要以某种方式将它传递到外面。
示例: 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!"
答案 2 :(得分:3)
通过在 this 范围内部声明它们来公开闭包的函数或属性(可以根据调用进行更改)。
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
在 this 中声明的方法可以访问使用 var 声明的变量,但不能反过来。
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
功能关闭范围。您要做的是返回对有权访问您所需范围的函数的引用,以便稍后调用它。
如果您需要创建一个稍后调用特定方法的函数,
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);
您可以使用不太可读的示例
来内联大部分内容setTimeout((function(ex_ref) {
return function() {
return(ex_ref.getDouble()); // == 4, when called
})(new example(2)))
, 1000
);
setTimeout 只是在新范围内演示执行的便捷方式。
var ex = new example(2);
var delayed_call = function() {
return(ex.getDouble());
}
delayed_call(); // == 4
答案 3 :(得分:0)
出于性能目的,您可以这样调用它:
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"