【问题标题】:Why is non-static variable behaving like static?为什么非静态变量表现得像静态?
【发布时间】:2015-09-19 10:15:20
【问题描述】:
function emergency() {
    var ambulance = 100;
    var callAmbulance = function() { alert(ambulance); }
    ambulance++;
    return callAmbulance;
}
var accident = emergency();
accident(); // alerts 101

我指的是变量'ambulance'

当我调用 accident(); 时,它应该调用 emergency(),它应该使用声明的变量 'ambulance' [考虑到 javascript 中的全局范围,它仍然可以将值设置为全局],但它使用旧值 101 而不是再次设置回 100 - 表现得更像 static var。

解释是什么?

【问题讨论】:

  • 为什么要使用旧值?此外,调用accident 不会调用emergency
  • 预期输出是什么?
  • 期望 100 作为输出。
  • emergency 将返回 callAmbulancecallAmublance 返回 ambulance 的值。你++'d ambulance,所以值为101。
  • 是什么让你认为accident(); 应该调用emergency()

标签: javascript function static


【解决方案1】:

您所拥有的称为closure。这意味着函数可以访问在外部函数(或全局范围)中声明的变量。即使在“父”函数返回后,它仍保留访问权限。您需要了解的是,您不会获得副本。对该变量执行的更改对您的内部函数是可见的,这在理论上意味着您可以让多个函数共享对同一变量的访问权限。

function f () {
  var x = 0;

  function a() { x += 1; }
  function b() { x += 2; }
  function show() { console.log(x); }

  return {a:a, b:b, show:show};
}

var funcs = f();
funcs.a();
funcs.b();
funcs.show(); // 3

需要注意的一点是,对f 的后续调用将创建一个新范围。这意味着将创建一个 new x 变量(还将创建新的 a、b、show 函数)。

var newFuncs = f();
newFuncs.a();
newFuncs.show(); // 1

funcs.a();
funcs.show(); // 4

那么,如何获得副本?创建一个新范围。

function g () {
  var x = 0;
  var a;

  (function (myLocal) {
    a = function () { myLocal += 1; }
  }(x));

  x += 200;

  return a;
}

JS只有传值,所以当你调用匿名函数时,x变量的值会被复制到myLocal参数中。由于a 将始终使用myLocal 变量,而不是x,因此您可以确定对x 变量执行的更改不会影响您的a 函数。

如果你有 PHP 背景,你可能习惯做类似的事情

use (&$message)

允许修改反映在您的函数中。在 JS 中,这是默认发生的。

【讨论】:

    【解决方案2】:

    您正在创建一个此时未编译的函数定义:

    var callAmbulance = function() { alert(ambulance); }
    

    在你将它发送到被调用函数之前,你正在递增 num:

    ambulance++;
    

    然后你将它发送到被调用的函数:

    return callAmbulance;
    

    但是,无论您是否将其发送到那里,都没有关系。下面的语句执行或编译函数:

    var accident = emergency();
    

    这会接受当前的ambulance 值,即增量后的101。这是创建函数但不执行它的预期行为。如果您不理解这种行为,请告诉我。我会解释得更清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2011-02-13
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多