首页 > 其他分享 >作用域与立即执行函数

作用域与立即执行函数

时间:2022-08-30 14:02:04浏览次数:51  
标签:function 函数 作用域 list li 立即 var

应用场景:

  • 改变变量作用域;

  上述代码就是改变变量作用域,一个很好的例子。

  • 封装临时变量;

  加载只需要执行一次的代码,比如显示时间。这些代码也需要一些临时的变量,但是初始化过程结束之后,就再也不会被用到。这些变量不适合作为全局变量,产生初始化代码遗留。可以用立即执行函数将所有的代码包裹在它的局部作用域中,这些变量都不会在全局变量中存在,以后也不会其他地方使用,有效的避免了污染全局变量。

 

概念:

声明一个函数,并马上调用这个匿名函数就叫做立即执行函数。

声明方式:

//第一种:用括号把整个函数定义和调用包裹起来
(function(){
 //function body
}())

//第二种:用括号把函数定义包裹起来,后面再加括号
(function (){
 //function body
})()

作用:

创建一个独立的作用域,这个作用域里面的变量,外面访问不到,即避免「变量污染」。

分析下面代码:

<ul id="list">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
var list = document.getElementById("list");  
var li = list.children;  
for (var i = 0; i < li.length; i++) {    
  li[i].onclick = function() {    
    console.log(i); // 结果总是3.而不是0,1,2                      
  }
}
</script>

解析:因为i是贯穿整个作用域的,而不是给每一个li分配一个i,点击事件使异步,用户一定是在for运行完了以后,才点击,此时i已经变成3了。

那么该如何解决这个问题:

// 使用立即执行函数 var list = document.getElementById("list"); var li = list.children; for (var i = 0; i < li.length; i++) {     (function(j) {         li[j].onclick = function() {             console.log(j);         }     })(i) }

如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数(上例中的i就是一个全局变量,i代表的是实参,j是i在立即执行函数中的形参)。

// 或者使用ES6的块级作用域 var list = document.getElementById("list"); var li = list.children; for (let i = 0; i < li.length; i++) {     li[i].onclick = function() {         console.log(i);     } }

标签:function,函数,作用域,list,li,立即,var
From: https://www.cnblogs.com/qingshuihongye/p/16639051.html

相关文章

  • R语言中seq函数
     001、seq(10)seq(2,10,2)##设置起始位置,步长  002、seq(2,10,length=2)##设置返回值的个数seq(2,10,le......
  • 函数
    4、函数1.什么是函数?具备某一功能的函数,事先准备好一个工具2,为何要使用函数?1>.不适应函数组织结构不清晰,可读性差2>.代码冗余,不好维护3>.如何使用函数原则:先定义后......
  • C调用C++函数
    2.C中调用C++函数`extern"C"`在C中是语法错误,需要放在C++头文件中。```c//add.h#ifndefADD_H#defineADD_Hextern"C"{  intadd(intx,inty);}#e......
  • 函数(知乎)学习笔记
    函数知乎系列笔记✏️在知乎上看到一个视频专栏,讲的`特别好`,函数之前跟着B站老男孩的视频过了一遍,再听知乎这套视频,温故而知新,又发现很多盲点了!知乎这套简短的视频言简意......
  • 说一说this指向(普通函数、箭头函数)?
    this存在的场景有三种全局执行上下文和函数执行上下文和eval执行上下文,eval这种不讨论,在全局环境中调用普通函数,严格模式下this指向undefined,非严格模式下this指向全......
  • C语言怎么给函数添加形参的默认值
    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16637890.html如果不是机缘巧合,当年转到C++之后,恐怕很难再有机......
  • Delphi 中constructor、destructor、property(构造函数,析构函数、属性)关键字的用法
    首先搜索现成的文章学习原文:https://www.cnblogs.com/guorongtao/p/15132445.html其次自己理解并总结最常见的用法constructor用来定义构造函数,destructor用来定义析构......
  • R语言中image函数绘制热图
     001、dat<-data.frame(rep1=sample(1:20),rep2=20:1,rep3=1:20)datimage(1:20,1:3,as.matrix(dat))##参数需要是矩阵  ......
  • python基础.内置函数(二),递归函数,二分法
    python基础.内置函数(二),递归函数,二分法  一.lamda匿名函数为了解决一些简单的需求而设计一句话函数 lambda表示的是匿名函数.不需要用def来声明, 一句话......
  • python基础-内置函数
    python基础-内置函数 什么是内置函数?就是python给你提供的.拿来直接用的函数,比如print.,input等等.截止到python版本3.6.python一共提供了了68个内置函数.他们......