是否可以在所述函数之外的匿名函数中访问变量?
我可能使用了错误的术语。
使用下面的伪代码,是否可以在同一页面上加载的另一个脚本中访问var1?
function(i,e){
var var1;
NewFunc.init = function(){
var1 = 5;
};
}
答案 0 :(得分:4)
是否可以在所述函数之外的匿名函数中访问变量?
不,实际上这是我们使用函数之一:隐藏事物。 :-)更多关于为什么这不仅仅是语法的怪癖。
函数中的变量对于该函数完全是私有的,而在中创建的其他函数(它们“关闭”它们创建的范围内的变量)。例如:
function foo() {
var answer = 42;
function bar() {
var question = "Life, the Universe, and Everything";
console.log(question, answer); // Works fine
}
console.log(question, answer); // Fails with a ReferenceError because
// `question` is out of scope
}
foo();
bar
可以访问foo
的{{1}}变量,因为在answer
内创建了bar
。但是foo
无法访问foo
的{{1}}变量,因为bar
未在question
内创建。
这意味着可以创建可以访问和修改私有变量的函数:
foo
请注意,如果我们尝试更换
bar
与
// This is ES5 and earlier style; in ES2015+, it could be a bit more concise
function foo() {
var answer = 42;
return {
getAnswer: function() {
return answer;
},
setAnswer: function(value) {
answer = value;
}
};
}
var o = foo();
console.log(o.getAnswer()); // 42
o.setAnswer(67);
console.log(o.getAnswer()); // 67
有两个很好的理由失败:
变量超出范围
如果以某种方式 范围内,console.log(o.getAnswer()); // 42
应该引用哪个?我们可以多次拨打console.log(answer);
,每次调用都会创建一个新的answer
变量,所以......
旁注:函数是命名还是匿名,或者它是普通函数还是ES2015的新“箭头”函数之一没有区别。