js的小题

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

请问执行结果是什么?

b:3 
报错:VM103723:10 Uncaught ReferenceError: a is not defined
    at :10:13

为什么a打印不出来?报错了?

回答:

这是因为在JavaScript中,括号内的内容被视为表达式,而不是函数声明语句。因此,在括号中使用匿名函数表达式是合法的,不需要使用函数名称来标识该函数。

在你提供的示例中, (function () {})表示的是一个立即执行的匿名函数表达式,它将包含的代码作为整体进行评估,并在执行后自动销毁。这种技术可以用来创建局部作用域、避免全局变量污染等。

在括号内定义变量b,没有使用var或let修饰符将其声明为局部变量,这会导致它变成了一个全局变量。因此,a被定义为3,而b也被定义为3,并成为一个全局变量。但是,这种写法不够清晰,并且容易引起混淆,因此应该谨慎使用。

总之,在JavaScript中,有两种类型的函数:函数表达式和函数声明。函数表达式可以是具名或匿名的,而函数声明必须具有名称。在JavaScript中,使用括号可以将函数声明强制转化为函数表达式,从而使它们成为有效的语句

在你提供的代码示例中,(function () { var a = (b = 3); })(); 创建了一个立即执行的匿名函数表达式。其中,var a = (b = 3); 定义了变量 a 和全局变量 b ,并将其赋值为 3。注意,由于缺少变量声明关键字(如 varlet),b 实际上成为了全局变量。

然而,当你尝试通过 console.log(b);console.log(a); 分别输出变量 ba 的值时,会出现以下结果:


3 ReferenceError: a is not defined

这是因为:

  1. b 是一个全局变量,因此它可以在任何地方访问到。所以 console.log(b); 输出的是全局变量 b 的值 3
  2. a 是在匿名函数内部声明的局部变量,它的作用范围仅限于该函数内部。因此,当你尝试在函数外部访问它时,会引发 ReferenceError 错误,表示 a 未定义。

请注意,在使用立即执行的匿名函数表达式时,应该避免出现不必要的全局变量,以及确保变量的作用范围符合预期

你可能感兴趣的:(javascript,开发语言,ecmascript)