javascript之模拟块级作用域

Posted 花信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript之模拟块级作用域相关的知识,希望对你有一定的参考价值。

在java、C++等语言中,变量i在会在for循环的语句块中定义,循环一旦结束,变量i就会被销毁。可是在javascript中,从定义开始,就可以在函数内部随处访问。比如

function output(){
  for(var i=0; i<10; i++){
  }
  alert(i); //10
  var i;  //重新声明
  alert(i); //10
}

javaScript会对后续i的声明视而不见,如果后续声明中有变量初始化还是会执行。可以使用匿名函数来模仿块级作用域,或者使用ES6的let命令。

  用块级作用域的匿名函数的语法如下:

(function(){

  //块级作用域

}) ();

将函数声明保存在一对圆括号中,表示它实际上是一个函数表达式,紧随其后的另一个圆括号会立即调用这个函数。

function output(){
  (function(){
       for(var i=0; i<10; i++){
  }
})();
  alert(i); //error
  var i;  //重新声明
  alert(i); //undefined
}

  这种技术经常在作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。js引擎读取一段js代码,首先预解析(这个名字我起的),就是逐行读取js代码,寻找全局变量和全局函数,遇到全局变量,把变量的值变为undefind,存在内存中,遇到全局函数,直接存在内存中,这个过程如果发现语法错误,预解析终止。限制全局作用域可以减少内存的占用。

或者使用let命令

function output(){
  for(let i=0; i<10; i++){
  var i; 
  alert(i); // undefined
}

 

以上是关于javascript之模拟块级作用域的主要内容,如果未能解决你的问题,请参考以下文章

下面JavaScript代码如何理解?块级作用域如何理?

0140 JavaScript作用域:概述全局作用域函数作用域块级作用域

javascript 作用域

ES6 之 let和const块级作用域

JavaScript作用域:全局作用域局部作用域块级作用域作用域链变量提升

JavaScript全局作用域函数作用域和块级作用域的区别