变量作用域,变量提升,函数提升

143 阅读1分钟
常见的变量作用域有哪些看不见的坑:

   在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问。if或者for中非函数内的变量都为全局变量。let需要先声明后赋值,而const 可以直接赋值而不用声明。

if (true) {
  var x = 5;
}
console.log(x); // 5 
if (true) {
  let y = 5;
}
console.log(y); // ReferenceError: y 没有被声明

 for(var i=0;i<10;i++){  
  }
console.log(i)//10  


变量提升:JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。

(function() { 
 var myvar;  
console.log(myvar); // undefined 
myvar = "local value";})();

ECMAScript 6 中,let(const)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。

console.log(x); // ReferenceError
let x = 3;


函数提升:对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。

/* 函数声明 */
foo(); // "bar"
function foo() {
  console.log("bar");
}
/* 函数表达式 */
baz(); // 类型错误:baz 不是一个函数
const baz = function() {
  console.log("bar2");
};