从匿名JavaScript函数访问变量

时间:2016-07-20 16:30:29

标签: javascript variables

是否可以在所述函数之外的匿名函数中访问变量?

我可能使用了错误的术语。

使用下面的伪代码,是否可以在同一页面上加载的另一个脚本中访问var1?

function(i,e){
    var var1;
    NewFunc.init = function(){
         var1 = 5; 
    };
}

1 个答案:

答案 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

有两个很好的理由失败:

  1. 变量超出范围

  2. 如果以某种方式 范围内,console.log(o.getAnswer()); // 42 应该引用哪个?我们可以多次拨打console.log(answer); ,每次调用都会创建一个新的answer变量,所以......

  3. 旁注:函数是命名还是匿名,或者它是普通函数还是ES2015的新“箭头”函数之一没有区别。