字符串引用在javascript闭包中的行为很奇怪

string references behaving strangley in javascript closure

本文关键字:引用 javascript 闭包 字符串      更新时间:2023-09-26

我想让下面的代码打印"cat",但是它打印的却是"bat"

var a = "cat";
x = function(){
  var b = a;
  console.log(b);
}
a = "bat";
x();

我怎么做才能得到内部函数能按我想要的方式工作吗?有没有办法在不分配更多空间的情况下做到这一点?

这是因为变量a在函数x执行之前被重新赋值给"cat"。因此,在调用x()之前,变量b将是未声明的。在声明过程中,a的值为"bat"

下面的代码段

x = function(){
  var b = a;
  console.log(b);
}

你刚刚定义了一个匿名函数,它绑定了一个外部分数变量a,结果是a closure。所以它受外部作用域的约束。所以在

x函数执行时
x();

a在全局作用域中的值是"bat",导致匿名函数返回"bat"

这样可能会更清楚

var a = "cat";
x = function(){
  var b = a;
  alert(b);
}
a = "bat";
x();//alerts bat
a = "wow";
x();//alerts wow
a = "im bound to the outer scope";
x();//alerts im bound to the outer scope

这修复了我遇到的问题:

var a = "cat";
function copyCatBuilder(animal){
    return function(){ console.log(animal)};
}
x = copyCatBuilder(a);
a = "bat";
x();

程序现在输出"cat"