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.pswp.cn/news/251198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251198.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

es6 --- 解構賦值的簡潔性

設想你有一個工具foo,它可以異步產生兩個值(x和y): function getY(x) {return new Promise( function(resolve, reject) {setTimeout( function() {resolve( (3*x) -1 );}, 100);}); }function foo(bar, baz) {var x bar * baz;return getY(x).then( function(y){return [x, …

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…

驗證碼何時可以退出歷史舞臺?

驗證碼是有必要存在的&#xff0c;只是不同階段表現形式不同&#xff0c;未來的趨勢是更加智能無感知&#xff0c;用戶體驗更好。 簡而言之&#xff0c; 驗證碼其終極目的&#xff0c;就是區分正常人和機器的操作。區分人機行為是必要的&#xff1a;互聯網上各種行為&#xff0…

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,它們中的任何一個,一旦開始了就會…

oracle-group by -having

1、GROUP BY 語句用于結合合計函數&#xff0c;根據一個或多個列對結果集進行分組。(也就是說group by 和聚合函數結合起來使用&#xff0c;要查詢的結果來沒有聚合函數則報錯&#xff1a;不是group by 表達式) a、where 不能放在group by 后面使用 b、having 要和group by 連在…

【轉載】匯編速查手冊

一、數據傳輸指令 ─────────────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據. 1. 通用數據傳送指令. MOV 傳送字或字節. MOVSX 先符號擴展,再傳送. MOVZX 先零擴展,再傳送. PUSH 把字壓…

ES5-9 【utils】構造函數及實例化原理、包裝類

1. 構造函數 調用構造函數實際會經歷4步 1 創建一個新對象 2 將構造函數的作用域賦值給對象&#xff08;因此this就指向了這個對象&#xff09; 3 執行構造函數中的代碼&#xff08;為這個新對象添加屬性&#xff09; 4 返回新對象 在構造函數內部&#xff0c;this指向構造函數…

es6 --- 異步迭代生成器 Promise

看一個經典ajax回調的例子: function foo(x, y, cb) {ajax("http://some.url.1/?x" x "&y" y,cb); }foo(11, 31, function(err, text) {if(err) {console.error(err);}else {console.log(text);} });// 異步請求some.url.1參數為x 11, y31的數據.…

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…

【心情隨筆】03

一、 越是學習越是感到自己的無知。以往總有不求甚解的做法&#xff0c;稍微看了一下就囫圇吞棗算懂了&#xff0c;其實這是逃避&#xff0c;不僅面試問的時候答不上來&#xff0c;而且內部可以用來擴展的思想也沒有領悟到。連該問題都說不清楚更不要說舉一反三了。近來&#x…

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.…

javascript --- 使用run函數,讓100條ajax依次執行

使用如下: function *foo(len,urlArray) {let r [];for(let i 0; i< len; i){r[i] yield request(urlArray[i]);} } // len:是長度,urlArray,是請求的url數組..下面附上run函數的代碼,以及證明以上是成立的 // Benjamin Gruenbaum(benjamingr on Github) function run(g…

[轉]IIS 允許/禁止 目錄瀏覽

<?xml version"1.0" encoding"utf-8"?> <configuration><system.webServer><directoryBrowse enabled"true" /></system.webServer> </configuration> enabled true -> 允許目錄瀏覽&#xff0c;子目…

C++編程基礎一 06-布爾類型

1 // 06-布爾類型.cpp: 定義控制臺應用程序的入口點。2 //3 4 #include "stdafx.h"5 #include <iostream>6 using namespace std;7 8 int main()9 { 10 bool a true; //真 存在的 非零 1 11 bool b false;//假 不存在 零 0 12 cout << …

性能優化雜記

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(對象…