javascript声明语句以及IIFE问题

JavaScript 遵循了一般编程语言的“语句 - 表达式”结构,多数编程语言都是这样设计的。

image.png
image.png

这里记录一下自己以前不太熟悉的知识点。

var语句

  • 预编译阶段变量提升
console.log(a); // undefiend
var a = 1;
  • 穿透for,switch,if等
if(true) {
  var a = 1;
}
console.log(a); // 1

let和const语句

  • 仅作用于当前作用域,不可再次声明。
  • const声明的变量无法修改。
  • 无变量提升问题。
  • 不会穿透for,switch,if等

函数声明

  • 预编译阶段提升
console.log(foo); // function
function foo() {};
  • 在if中不会提升
console.log(foo); // undefined
if(true) {
  function foo() {};
}

IIFE-立即执行的函数表达式

  • 用来产生作用域,例如:
for (var i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i); // 得到10个10
  })
}

// 使用IIFE来得到0-9
for(var i = 0; i < 10; i++){
  (function(a){
    setTimeout(function(){
      console.log(a); // 得到0-9
    }, 0)
  })(i);
};
  • 产生只读的函数名特性
var a = 1;
(function a() {
  console.log(a); // function
  a = 2; // 在当前作用域中a作为函数名只读,无法修改
  console.log(a); // function
})();
console.log(a); // 1;

你可能感兴趣的:(javascript声明语句以及IIFE问题)