javascript 中的 IIFE 和全局范围
IIFE and Global scope in javascript
为什么以下代码会导致记录 b
而 a
仍然是 undefined
?
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
因为 var a=b=5;
语句仅定义局部 a
变量,实际上被解释为
var a = (b=5);
等于
b = 5;
var a = 5;
将 5
分配给全局 b
变量并定义局部 a
变量。
定义 2 个没有值重复的局部变量的正确方法是
var b = 5, a = b;
变量可以通过两种方式定义:
- var a= 5 // 第一个
- a=5 // 第二个
第一种方式a
是局部变量,第二种方式变成全局变量
因此,当您执行 var a=b=5
时,b
是一个全局变量,因此保留值。
在JavaScript中,如果您在变量前省略 var 关键字,它将被视为全局变量。
所以这里 b 是一个全局变量, a 只是该函数范围的局部变量。
这就是为什么您在访问 a.
时出现错误的原因
没关系,我自己想通了,因为它不会让我睡觉。
IIFE 中发生了 2 次赋值,而只有 1 次声明。
语句var a=b=5;
用var
声明了变量a
,但只是简单地为另一个变量b
赋值。
b
实际上从未在这里声明,只是赋值 - 使其成为 全局变量 。
因此 b
可在函数 外部的日志语句 访问,它将其值打印为 5
.
换句话说,在'strict'模式下,代码将如下所示:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
为什么以下代码会导致记录 b
而 a
仍然是 undefined
?
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
因为 var a=b=5;
语句仅定义局部 a
变量,实际上被解释为
var a = (b=5);
等于
b = 5;
var a = 5;
将 5
分配给全局 b
变量并定义局部 a
变量。
定义 2 个没有值重复的局部变量的正确方法是
var b = 5, a = b;
变量可以通过两种方式定义:
- var a= 5 // 第一个
- a=5 // 第二个
第一种方式a
是局部变量,第二种方式变成全局变量
因此,当您执行 var a=b=5
时,b
是一个全局变量,因此保留值。
在JavaScript中,如果您在变量前省略 var 关键字,它将被视为全局变量。 所以这里 b 是一个全局变量, a 只是该函数范围的局部变量。 这就是为什么您在访问 a.
时出现错误的原因没关系,我自己想通了,因为它不会让我睡觉。
IIFE 中发生了 2 次赋值,而只有 1 次声明。
语句var a=b=5;
用var
声明了变量a
,但只是简单地为另一个变量b
赋值。
b
实际上从未在这里声明,只是赋值 - 使其成为 全局变量 。
因此 b
可在函数 外部的日志语句 访问,它将其值打印为 5
.
换句话说,在'strict'模式下,代码将如下所示:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);