说我有这个匿名功能:
(function(window){
var private = 'private msg';
function sayit() {
alert(private) // works
}
document.body.onclick = sayit; // works
})(window);
// private shouldn't be accessible here
这是JavaScript应该如何表现的吗?
也就是说,无法从该匿名函数之外的任何地方访问private
?
如果是这样,是否有可能从外部找到某种黑客访问private
,让代码保持原样?
答案 0 :(得分:11)
是的,这就是Javascript让你拥有'私有'变量(隐藏在函数范围内)的方式。
不,没有hack可用于访问private
等变量而无需重写代码。
函数中使用var
定义的变量只能从该函数中访问。
答案 1 :(得分:8)
确定。我懂了。
(function(window){
var alert_original = window.alert;
window.alert = function(data) {
window.extracted = data;
alert_original(data);
};
})(window);
(function(window){
var private = 'private msg';
function sayit() {
alert(private) // works
}
document.body.onclick = sayit; // works
})(window);
点击正文后,您可以从extracted
答案 2 :(得分:2)
它们不是“私人”变量;这就是闭包的工作原理。您可以在Perl和Python中执行相同的操作,至少可以使用闭包和词法范围等许多其他语言。
像Firebug或Chrome Inspector这样的调试器仍然可以在任何时候显示整个堆栈(包括已关闭的变量),但除此之外并且不更改原始代码,我认为你运气不好。
也许如果你告诉我们你的实际问题......:)
答案 3 :(得分:0)
这就是拥有范围和私有变量的重点
无论
将私有值设置为全局变量?
或
在
之外声明变量答案 4 :(得分:-1)
你必须做这样的事情:
var Test = (function(window){
var private = 'private msg';
var api = {};
function sayit(){
alert(private) // works
}
document.body.onclick = sayit; // works
api.sayit = sayit;
return api;
})(window);
Test.sayit(); //this would alert 'private msg'