立即执行函数

简介: 立即执行函数

一、前言

我们知道在原生JavaScript中只有全局作用域和函数作用域,公有变量很容易造成污染。

为了解决这个问题,必须要对作用域进行隔离,这个时候就想到了立即执行函数。

二、立即执行函数(IIFE)

立即执行函数会创建一个独立的作用域,这个作用域里的变量外部无法访问,其变量用完就释放,能够减小内存的压力。

1. 特点

  1. 只有函数表达式可以,函数声明不可以
  2. 函数表达式中的名字不会放在GO或者AO中

2. 常见形式

var f1 = (function(name) {
    console.log(name);
})('Mike'); // 'Mike'
var f2 = (function(name) {
    console.log(name);
}('Nancy')); // 'Nancy'
var f3 = function(name) {
    console.log(name);
}('Lucy'); // 'Lucy'

注意:这里推荐使用第一种写法。

3. 其他形式

!function(){console.log(1);}(); // 1
+function(){console.log(2);}(); // 2
-function(){console.log(3);}(); // 3
~function(){console.log(4);}(); // 4
void function(){console.log(5);}(); // 5
new function(){console.log(6);}(); // 6


三、案例

// 点击li标签打印其下标
window.onload = function() {
    for(var i = 1; i <= 6; i++) {
        var body = document.getElementsByTagName('body')[0];
        var li = document.createElement('li');
        li.innerHTML = i;
        body.append(li);
    }
    var liArr = document.getElementsByTagName('li');
    console.log(liArr);
    for(var i = 0; i < 6; i++) {
        liArr[i].onclick = function() {
            console.log(i); // 每一个节点元素都打印 6
        }
    }
}
// 使用立即执行函数创建独立的作用域
// 解决公有变量污染问题
window.onload = function() {
    for(var i = 1; i <= 6; i++) {
        var body = document.getElementsByTagName('body')[0];
        var li = document.createElement('li');
        li.innerHTML = i;
        body.append(li);
    }
    var liArr = document.getElementsByTagName('li');
    console.log(liArr);
    for(var i = 0; i < liArr.length; i++) {
        (function(n) {
            liArr[n].onclick = function() {
                console.log(n); // 0 1 2 3 4 5
            };
        })(i);
    }
}

四、本节思维导图

1688211022499.png

目录
相关文章
|
Java 测试技术 API
Zookeeper开源客户端Curator之基本功能讲解
Zookeeper开源客户端Curator之基本功能讲解
738 0
Zookeeper开源客户端Curator之基本功能讲解
|
JavaScript
vue-element-admin 安装依赖 npm install 报错ERESOLVE unable to resolve dependency tree解决方案
vue-element-admin 安装依赖 npm install 报错ERESOLVE unable to resolve dependency tree解决方案
|
安全 关系型数据库 MySQL
Linux云服务器CentOS7版本下安装mysql5.7
Linux云服务器CentOS7版本下安装mysql5.7
|
小程序 开发工具 开发者
解决微信开发者工具不能使用云开发的资源
解决微信开发者工具不能使用云开发的资源
|
消息中间件 前端开发 Java
【面试题】前端必修-浏览器的渲染原理
【面试题】前端必修-浏览器的渲染原理
216 0
|
前端开发 JavaScript BI
JavaScript的过滤大师:深度解析Filter用法
JavaScript的过滤大师:深度解析Filter用法
810 0
|
安全 PHP
【PHP开发专栏】PHP文件上传与下载实现
【4月更文挑战第30天】本文介绍了在PHP中实现文件上传和下载的详细步骤。文件上传通过`$_FILES`全局数组处理,包括设置HTML表单、PHP脚本处理上传及安全性考虑。文件下载则可使用`readfile()`、`fpassthru()`或`file_get_contents()`函数,同时关注安全问题,如防止目录遍历漏洞。文中还提供了一个简单的图片分享网站案例,演示了上传和下载功能的集成。
253 1
|
Linux 编译器 vr&ar
【库函数】Linux下动态库.so和静态库.a的生成和使用
【库函数】Linux下动态库.so和静态库.a的生成和使用
480 1