【问题标题】:Function-calling Context函数调用上下文
【发布时间】:2015-02-12 16:33:32
【问题描述】:

我认为下面的 JavaScript 会导致obj.fnentryPoint(). 的上下文中运行

但是当obj.fn()runs 时,会引发'locVar is undefined'exception。

  function entryPoint () {
    var locVar = "xxx";
    var obj    = {};

    PassRcvr(obj);

    obj.fn();

  }

  function PassRcvr(passedObj) { // Being an object, the arg is passed by reference.
    passedObj.fn = function  () {
      alert(locVar);
    }
  }

下面的 JScript,但是确实locVar. 的意识下运行

  function entryPoint () {
    var locVar = "xxx";
    var obj = {};

    PassRcvr(obj);

    obj.fn();

    function PassRcvr(passedObj) {
        passedObj.fn = function  () {
        alert(locVar);
      }
    }

  }

为什么obj.fn()不知道在这两种情况下调用它的上下文,而不仅仅是一个?

【问题讨论】:

  • Javascript 是词法(或“静态”)范围的语言,您正在寻找的是“动态”范围。有些语言支持它,但 Javascript 不支持。

标签: javascript internet-explorer jscript


【解决方案1】:

上下文this的值。您没有使用它,因此它与您的问题无关。

范围没有通过。一个函数保持它被声明的范围(这就是我们可以在 JS 中使用闭包的原因)。由于在第一个示例中 PassRcvr 没有在 entryPoint 中定义,因此它无法访问作用域为 entryPoint 的变量。

【讨论】:

  • 我不知道 JS 语言有这样的规范,即函数保持声明它们的范围。这当然可以解释它。
【解决方案2】:

在第一种情况下,PassRcvr 位于全局范围内,而 locVarentryPoint 函数的本地范围内 - 这就是它无法访问的原因。

在第二种情况下,PassRcvrlocVar 都在一个本地范围内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多