Javascript 在 IIFE 中声明的链式变量赋值获得全局可见性?
Javascript chained variable assignments declared inside IIFE gets global visibility?
最近有人问以下 JavaScript 代码会产生什么结果,正确答案让我感到困惑:
(function () {
var a = b = 5;
})();
console.log(b);
我原以为这会打印 undefined
但它实际上打印 5
.
根据我的理解,IIFE(立即调用的函数表达式)中定义的所有变量都应该不在其范围之外可见。这些变量声明的顺序究竟如何使 b
在其范围外可见而 a
在其范围外不可见?
这个:
var a = b = 5;
相当于:
b = 5;
var a = b;
不会
var b = 5;
var a = b;
它创建b
作为一个全局的,然后将b
的值赋给a
。
严格模式下也是禁止的。始终使用严格模式!
"use strict";
(function () {
var a = b = 5;
})();
console.log(b);
您的代码等同于此
(function () {
b = 5;
var a = b;
})();
console.log(b);
如果您声明一个没有 var, let or const
的变量,它将是全局变量并分配给 window
对象(在浏览器的 JS 中),因此可以从任何地方访问它。
在一个语句中声明多个 var
的语法是:
var a, b;
// or:
var a = 5, b = 5;
你有的是var a
的声明,但是b
是值表达式的一部分,不受var
的影响,所以泄漏到全局范围。
最近有人问以下 JavaScript 代码会产生什么结果,正确答案让我感到困惑:
(function () {
var a = b = 5;
})();
console.log(b);
我原以为这会打印 undefined
但它实际上打印 5
.
根据我的理解,IIFE(立即调用的函数表达式)中定义的所有变量都应该不在其范围之外可见。这些变量声明的顺序究竟如何使 b
在其范围外可见而 a
在其范围外不可见?
这个:
var a = b = 5;
相当于:
b = 5;
var a = b;
不会
var b = 5;
var a = b;
它创建b
作为一个全局的,然后将b
的值赋给a
。
严格模式下也是禁止的。始终使用严格模式!
"use strict";
(function () {
var a = b = 5;
})();
console.log(b);
您的代码等同于此
(function () {
b = 5;
var a = b;
})();
console.log(b);
如果您声明一个没有 var, let or const
的变量,它将是全局变量并分配给 window
对象(在浏览器的 JS 中),因此可以从任何地方访问它。
在一个语句中声明多个 var
的语法是:
var a, b;
// or:
var a = 5, b = 5;
你有的是var a
的声明,但是b
是值表达式的一部分,不受var
的影响,所以泄漏到全局范围。