javascript中的IIFE和全局范围
为什么以下代码导致javascript中的IIFE和全局范围,javascript,global-variables,iife,Javascript,Global Variables,Iife,为什么以下代码导致b的日志记录,而a仍然未定义 (function(){ var a=b=5; })(); console.log('b:'+b); console.log('a:'+a); 因为var a=b=5语句只定义局部变量,实际上解释如下 var a = (b=5); 等于 b = 5; var a = 5; 它将5分配给全局b变量,并定义局部a变量 定义2个局部变量而不重复值的正确方法是 var b = 5, a = b; 变量可通过两种方式定义: 变量a=5//首先 a=
b
的日志记录,而a
仍然未定义
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
因为
var a=b=5
语句只定义局部变量,实际上解释如下
var a = (b=5);
等于
b = 5;
var a = 5;
它将5
分配给全局b
变量,并定义局部a
变量
定义2个局部变量而不重复值的正确方法是
var b = 5, a = b;
变量可通过两种方式定义:
- 变量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
实际上从未在这里声明过,只是赋值了-使其成为一个全局变量
因此,函数外部的log语句可以访问b
,它将其值打印为5
换句话说,在“严格”模式下,代码将如下所示:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
你指的“拳头法”和“第二法”是什么?谢谢@samrat,“严格”模式揭示了这个漏洞。