gpt4 book ai didi

javascript - 为什么非静态变量的行为类似于静态变量?

转载 作者:行者123 更新时间:2023-11-28 19:00:30 25 4
gpt4 key购买 nike

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。

有什么解释吗?

最佳答案

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

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 的后续调用将创建一个新作用域。这意味着将创建一个 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)

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

关于javascript - 为什么非静态变量的行为类似于静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32667005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com