var b = 10;
(function b(){
b = 20;
console.log(b);
})();
输出结果为 function b() { b = 20; console.log(b); }。
- 解释 b没有被修改:
在这段代码中,b 是一个函数名,它在函数内部被定义为一个常量,因此无法被重新赋值。尽管在函数内部执行了 b = 20 这条语句,但它并没有修改函数名 b 的值,而是将 b 当作一个变量进行了赋值。由于 b 在函数内部是一个常量,因此这条语句实际上是创建了一个新的变量 b 并将其赋值为 20,而原来的函数名 b 的值并没有改变。因此,在自执行函数内部输出 b 时,输出的仍然是函数本身。如果将 b 定义为一个变量而不是函数名,那么 b = 20 就会修改变量的值。例如:
plaintextCopy code
var b = 10;
(function(){
var b = 20;
console.log(b); // 输出 20
})();
在这个例子中,b 是一个局部变量,因此可以被重新赋值。在函数内部执行 b = 20 这条语句时,它会修改变量 b 的值为 20,因此在自执行函数内部输出 b 时,输出的是变量的值 20。
- 解释 外部b的值没变:
在 JavaScript 中,变量的作用域有全局作用域和局部作用域。全局变量可以在代码的任何地方访问,而局部变量只能在声明它的函数内部访问。在函数内部定义的变量,包括局部变量和函数参数,只能在函数内部访问,并且不能修改函数外部的变量值。 当在函数内部定义一个同名的局部变量时,它会覆盖同名的全局变量。但是,在函数内部修改局部变量的值并不会影响到全局变量的值,因为这两个变量在内存中存储在不同的位置。例如,下面的代码中,全局变量 x 的值为 10,函数内部定义了一个同名的局部变量 x,并将其值修改为 20:
plaintextCopy code
var x = 10;
function foo() {
var x = 20;
console.log(x); // 输出 20
}
foo();
console.log(x); // 输出 10
在函数内部输出 x 的值时,输出的是局部变量 x 的值,即 20。但是,在函数外部输出 x 的值时,输出的是全局变量 x 的值,即 10。 如果要在函数内部修改全局变量的值,可以通过在函数内部省略 var 关键字来实现。在 JavaScript 中,如果在函数内部使用未声明的变量,该变量会自动被定义为全局变量。例如:
plaintextCopy code
var x = 10;
function foo() {
x = 20;
}
foo();
console.log(x); // 输出 20
在这个例子中,函数 foo() 内部省略了 var 关键字,因此 x 被定义为全局变量。在函数内部将 x 的值修改为 20 时,实际上是修改了全局变量 x 的值,因此在函数外部输出 x 的值时,输出的是修改后的值 20。