码迷,mamicode.com
首页 > Web开发 > 详细

JS 模仿块级作用域

时间:2018-10-02 17:29:08      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:全局   ==   OLE   初始化   get   style   UNC   限制   引用   

function outputNumbers(count) {

  for (var i=0; i<count; i++) {

    console.log(i);

  }

  var i;  // 重新声明变量

  console.log(i);  // 计数

}

上述中,重复声明了i变量,但是JS从来不会告诉你是否多次声明了同一变量;遇到这种情况,它只会对后续的声明视而不见

不过,它会执行后续声明中变量的初始化。匿名变量可以用来模仿块级作用域并避免这个问题。

(function() {

  // 这里是块级作用域(私有作用域)

}) ();

以上代码定义并立即调用了一个匿名函数。将函数声明包含在一对圆括号中,表明它是一个函数表达式。

function () {

  //这里是块级作用域

}();   // 出错

 上述会出错,因为JS将function关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。要将函数声明转化为函数表达式,只需要加一对圆括号

无论在什么地方,只要临时需要一些变量,就可以使用私有作用域。

function outputNumbers (count) {

  (function () {

    for (var i=0; i<count; i++) {

      alert(i);

    }

  })();  // 是闭包,使用块级作用域同时减少了闭包占用内存的问题,因为没有指向匿名函数的引用,所以一旦执行完成就会被销毁

  alert(i); // 出错

}

我们在for循环外部插入了一个私有作用域,在匿名函数中定义的任何变量,都会在执行结束时被销毁。

因此,变量i只能在循环中使用,使用后即被销毁。

而在私有作用域中可以访问count,是因为这个匿名函数是一个闭包,它能够访问包含作用域中所有变量。

这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。

一般来说,我们都应该尽量少向全局作用域中添加变量和函数。

过多的全局变量和函数容易造成命名冲突

(function () {

  var now = new Date();

  if (now.getMonth() == 0 && now.getDate() == 1) {

    alert(‘Happy New Year !‘);

  }

})();

 

JS 模仿块级作用域

标签:全局   ==   OLE   初始化   get   style   UNC   限制   引用   

原文地址:https://www.cnblogs.com/aizzz/p/9736850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!