这是一种捕获闭包定义堆栈的方法吗
Is it a way to capture the stack of closure definition?
我目前正在研究一种将JavaScript函数保护为private的方法,如果调用方无效,则会引发异常。那么我这里有一个问题:如果一个闭包是在一个有效的调用者内部定义的,那么这是从内部闭包中获取有效调用者的一种方法吗?
例如:
function validCaller() {
var self = this;
self.privateFunction1();
$.each([/*...*/], function (key, val) {
self.privateFunction2();
});
}
当然,privateFunction1
将正确地获得调用者validCaller
,但privateFunction2
将获得匿名函数作为调用者,因此访问将被拒绝。
如果我通过表达式caller.caller.caller
从调用堆栈中获取validCaller,这不是正确的方法,因为我无法确定应该追溯多少级别,而且在某些特殊情况下,需要在validCaller
之外调用匿名函数。
也许我用一种复杂的方式问了这个问题,简单的方式是:
如何捕获函数的作用域链
保持隐私的合理方法就是不告诉任何人…
function MyObject(a, b, c)
{
this.a = a;
this.b = b;
this.c = c;
// Note: NOT using this.private1 = function() { ... }
function private1()
{
...
}
function private2()
{
...
}
// Public methods
this.public1 = function()
{
...
private1(); // Note; not using "this." in the call
...
private2();
}
}
用这种方法不仅除了MyObject
的方法之外没有人能够调用private1
和private2
。。。但其他人甚至无法找到这些名称,也不会有意外名称冲突的风险。
您可以对私有数据成员使用相同的方法。只需在构造函数中将它们声明为简单的局部变量var x;
,不使用this.x
语法来访问它们,只使用x
。至于这些方法,没有人能够访问它们,甚至不会有意外重写的风险。
如果您真的想通过运行时检查来防止未经授权的函数调用您的方法,您可以使用某种"安全令牌"。
function MyObject()
{
var authorization = []; // An empty array will do
this.private_method = function(auth) {
if (auth !== authorization) throw "Unauthorized call";
...
};
this.public_method = function() {
...
this.private_method(authorization);
...
};
}
使用这种方法,您甚至可以确定哪个实例正在调用私有方法。
如果您希望任何实例都具有此功能,那么将构造函数本身作为一个闭包,从封闭范围捕获授权令牌。
附言:我不知道你为什么要这么做,但听起来很奇怪。
相关文章:
- 为Google闭包类定义属性的首选方式是什么
- 这是一种捕获闭包定义堆栈的方法吗
- 在 For 循环中的闭包中未定义
- 高级闭包兼容性和静态类型 - 使用未定义类型和全局函数,如localStorage.getItem();
- 闭包编译器 - 保留未使用的函数,不要重命名未定义的函数
- 仅在闭包中定义的模拟/存根对象
- 在其他地方定义的 JavaScript 闭包
- 如何在PrimeFaces中的命令按钮上定义带有闭包的oncomplete事件
- Javascript 闭包(使用参数名称在同一函数中定义对象)
- Google闭包在高级模式下调用未定义的函数
- 使用闭包编译器键入indexOf重新定义
- C#Asp.net自定义控件的Javascript闭包
- 使用闭包创建的私有函数如何访问构造函数中定义的变量
- 为什么我必须在闭包中声明一个函数来访问闭包中定义的变量
- 无法创建闭包中定义的函数的对象
- 获得'未定义'使用闭包工具继承时出现属性错误
- 传递给闭包的角度参数未定义
- 从外部(即定义闭包的作用域)访问闭包内部定义的var
- 在解析时定义闭包函数
- 在生成过程中将代码包装在自定义闭包中