ES5-7 立即执行函数、闭包深入、逗号运算符

1. 立即执行函数

  • 定义在全局的函数只有关闭浏览器或者退出程序才会释放
  • IIFE: Immediately-Invoked Function Expression
  • 解决页面加载自动执行,执行完成后立即释放(避免了只会执行一次的内容一直存在于全局)
  • IIFE用匿名函数或者函数声明(会忽略函数名)都是一样的效果,执行完成后立即释放
  • 一定是表达式才能被执行符号执行
  • 表达式会忽略函数名 → 函数表达式如果命名了a,不会被声明
  • 连续写2个立即执行函数,要用分号间隔(习惯是在最前面加分号)
    在这里插入图片描述
    在这里插入图片描述

延伸:函数名

  • 总结:找名字无限制,调用有限制
  • 表达式后的函数若有名字a,调用.name打印出a(不管在函数内部还是外部,.name都能获得名字)
var test = function a() {console.log(arguments.callee)console.log(test.name) // aa() // 只能在内部调用
}
test()
console.log(test.name) // a
console.log(a) // 报错

在这里插入图片描述

  • 延伸 声明变量test若是匿名函数,调用.name打印出test
var test = function () {console.log(test.name) // testconsole.log(arguments.callee)
}
test()
console.log(test.name) // test

在这里插入图片描述

  • 但直接打印a总是会报错,因为a没有被声明
var test = function a() {console.log(arguments.callee)
}
test()
console.log(test.name)
console.log(a)

在这里插入图片描述

  • 题目-这里可没有函数,无形参,这个题目考的是,表达式会忽略函数名
    1h22min
var a = 10;
if (function b() { }) {a += typeof (b)
}
console.log(a) // 10undefined
  • 立即执行函数写法
// W3C建议 ()是表达式 分号结尾
(function(){}());
// 实际更常用 表达式后加() 表示函数执行
(function(){})();
// 也可以传参
(function test(a,b){})(1,2);
// 接收返回值
var sum = (function test(a,b){return a + b
})(1,2);
  • 函数声明不能直接调用,会报语法错误:js将function关键字当做一个函数声明的开始,而函数声明后面不能跟圆括号
  • 函数声明 → 表达式:在前面加 + - ! || &&
function (){
}() // 报错
  • 不报错,当括号内有值,js引擎认为这是表达式
function test(){console.log(1)
}(1)
// js引擎
function test(){console.log(1)
}
(1) // 如果括号里没值,js引擎认为这是立即执行,就要报语法错误
  • 将 IIFE 分配给一个变量,不是存储 IIFE 本身,而是存储 IIFE 执行后返回的结果
var result = (function () {var name = "Barry";return name;
})();
// IIFE 执行后返回的结果:
result; // "Barry"
  • 函数表达式可以直接加()调用,也是立即执行 函数声明不行,但表达式可以直接加()
var test = function (){
}()
console.log(test) // IIFE无返回值undefined
var test = function () {
}
console.log(test) // f(){}

2. 闭包深入

  • 打印10个10
  • 在test内部var i是局部变量
  • test执行结束,i值为10,且生成了10个闭包
  • 每个闭包拉扯着test执行期间的AO(含i、arr
  • test执行结束,i值为10
    在这里插入图片描述
  • 改成立即执行,则不必声明、return arr了,函数执行完就被销毁了
function test() {var arr = []for (var i = 0; i < 10; i++) {arr[i] = (function (curIdx) {console.log(curIdx)})(i);}
}
test()
  • 或者再用立即执行函数包裹一层
function test() {var arr = []for (var i = 0; i < 10; i++) {(function (curI) {arr[i] = function () {console.log(curI)}}(i))}return arr
}
var myArr = test()
console.log('myArr', myArr)
myArr[0]()
myArr[1]()
myArr[2]()
  • 应用:点击li打印对应的下标在这里插入图片描述
  • 累加器
function add() {var num = 0return function () {console.log(++num)}
}
var myAdd = add()
myAdd()
myAdd()
myAdd()
  • 学生名单管理
function classRoom() {var names = []function addStudent(name) {names.push(name)console.log('加入学生' + name + ',当前名单:', names)}function leaveStudent(name) {// indexOffor (var i = 0; i < names.length; i++) {var item = names[i] // 缓存每一项,优化for循环性能if (item  === name) {names.splice(i, 1)break}}console.log('学生' + name + '离开,当前名单:', names)}return {addStudent: addStudent,leaveStudent: leaveStudent}
}
var myObj = classRoom()
var myAdd = myObj.addStudent
var myLeave = myObj.leaveStudent
myAdd('东邪')
myAdd('西毒')
myAdd('南帝')
myAdd('北丐')
myLeave('西毒')
myLeave('北丐')
myAdd('中神通')

在这里插入图片描述

3. 逗号运算符

  • 只返回最后一个逗号后的内容
var fn = (function test1() {return 1},function test2() {return '1'}
)()
console.log(typeof (fn)) // string

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis安装(linux)

一、redis安装步骤 1、yum install gcc 如果你机器已经安装了编译环境请忽略&#xff0c;否则在使用make编译源码时会报错。 报错信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下载包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解压tar包 tar…

ES5-8 闭包高级、对象、构造函数、实例化

1. 对象 对象内定义的函数一般称之为方法&#xff0c;在外部的函数声明称为函数对象删除属性使用delete 关键字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在对象里&#xff0c;this…

es6 --- 使用生成器交替执行

考虑以下场景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180对于上面的两个函数foo和bar,它们中的任何一个,一旦开始了就会…

ES5-9 【utils】构造函数及实例化原理、包装类

1. 构造函数 调用构造函数实际会经历4步 1 创建一个新对象 2 将构造函数的作用域赋值给对象&#xff08;因此this就指向了这个对象&#xff09; 3 执行构造函数中的代码&#xff08;为这个新对象添加属性&#xff09; 4 返回新对象 在构造函数内部&#xff0c;this指向构造函数…

Mysql5.7.20使用group by查询(select *)时出现错误--修改sql mode

使用select * from 表 group by 字段 时报错错误信息说明&#xff1a; 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column haha_db.staff.id which is not    functionally dependent on columns in GROUP BY clause; this…

ES5-10 原型、原型链、闭包立即执行函数、插件开发

重学第六章 1. 原型 实例内属性和原型上属性重名时&#xff08;屏蔽&#xff09; function Test(name) {this.name name } Test.prototype.name hhh let tObj new Test(yyy) console.log(tObj.name) // yyy tObj.name null console.log(tObj.name) // null delete tObj.…

性能优化杂记

webpack 开发、生产环境配置不同的webpack配置文件 生产环境删除devServer&#xff08;不需要启webpack devServer&#xff09; 告诉webpack&#xff0c;生产、开发分别要对应哪个配置文件 开发环境下也能看到打包的结果 npm run dev:build npm run dev 只会把打包生产…

算法 --- 冒泡排序、选择排序、插入排序的js实现

冒泡排序: function bubbleSort(arr){let i arr.length;while(i >0){for(let j 0; j< i; j) {let pos 0;if(arr[j] > arr[j1]) {pos j;let temp arr[j];arr[j] arr[j1];arr[j1] temp;}}i pos;}return arr; } var arr [3,44,38,5,47,15,36,26,27,2,46,4,19,5…

appium--每次启动会重新安装的问题(没试过)

有人说加这个 最后 大神说 在appium哪里就可以设置了 对&#xff0c;第一个不勾选就不会安装了【经理】[Java]大连●Messi_Z(726862194) 15:54:10把这些东西全去掉就好了转载于:https://www.cnblogs.com/kaibindirver/p/8205031.html

爬虫从入门到放弃 - 纯新手学习-爬虫基本原理

1.什么是爬虫&#xff1f; 请求网站并提取数据的自动化程序 请求&#xff1a;客户端向服务端发送请求获得网页资源&#xff0c;是一段html代码&#xff0c;包含html标签和一段信息。 提取&#xff1a;提取出想要的信息&#xff0c;然后将结构化的数据存储到文本 自动化&#xf…

ES5-11原型与原型链深入、对象继承

原型 谁调用&#xff0c;this就指向谁&#xff0c;当实例对象有该属性时&#xff0c;不会去原型上查找 创建对象的两种方法&#xff1a;字面量、new Object&#xff08;&#xff09;一般不用后面的二者创建出来的对象没有差异 Object.create() var 实例 Object.create(对象…

算法 --- 希尔排序、归并排序、快速排序的js实现

希尔排序: function shellSort(arr) {let len arr.length;let temp, gap 1;while(gap < len/3) {gap gap*3 1}while(gap >1) {for(let i gap;i< len; i) {temp arr[i];for( var j i-gap; j> 0 && arr[j] > temp; j - gap) {arr[j gap] arr[j];}…

ES5-12 【utils】继承深入、call、apply、圣杯模式、模块化

继承深入 这两种方式继承不够合理&#xff08;为什么&#xff09; 将实例作为子类的原型 在子类的构造函数内部借用父类的构造函数 将父类的原型作为子类的原型&#xff08;会修改父类的原型&#xff09; css圣杯布局&#xff08;左右宽度固定、中间自适应&#xff09…

vue实现星级评价效果

希望对你们有用&#xff0c;已经自己试过可以的才发布出来的 效果如下&#xff1a; html&#xff1a; <template> <div class"evaStar"> <ul class"star"> <li v-for"(itemClass,index) in itemClasses" :class"itemC…

算法 --- 二叉树查找树的先序(中序、后序)遍历的js实现

结点: function Node(data, left, right) {this.data data;this.left left;this.right right;this.show show; }显示树的数据: function show(){return this.data; }二叉查找树: // Binary Search Tree function BST(){this.root null;this.insert insert; }添加结点到…

ES5-13 对象属性遍历、this、callee、caller

链式调用 在每个函数内部return this 访问对象属性 点语法[]中括号内是字符串或是变量 数组是特殊的对象 对象属性遍历 for in(遍历对象或数组) - 不必再用Object.keys那么麻烦了 for(var key in obj){console.log(obj[key])// obj.key返回undefined// 因为js引擎会转换为…

算法 --- 顺序查找、二分查找的js实现

顺序查找: function seqSearch(arr, data) {for(let i 0; i< arr.length;i) {if(data arr[i]) {return i;}}return -1 } var arr[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(seqSearch(arr, 15))二分查找: function binSearch(arr, data) {let low 0;let…

vue --- cdn导入,一些基本操作

使用cdn导入vue.并使用vue做一些简单的操作. cdn导入vue: <script src"https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>vue-router的CDN导入: <script src"https://unpkg.com/vue-router2.5.3/dist/vue-router.js"></scrip…

ES5-14 【utils】三目运算符、对象克隆、浅拷贝、深拷贝

浅拷贝 for-in&#xff08;遍历一个实例对象&#xff0c;原型上的属性也会打印&#xff09; Object.prototype.num 1 function shallowClone(origin, target) {for (var key in origin) {target[key] origin[key]} } var p1 {name: 人类,daughter: {first: Jessica,} } va…

java代理的原理及应用

什么是代理模式&#xff1f; 定义 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 ——百度百科 代理模式的角色 抽象角色&#xff1a;代…