從node.js模塊化開發來了解javascript閉包
阿新 • • 發佈:2017-09-27
js模塊 efi 使用 ict node cau class 無法訪問 完成
之前看過很多關於javascript閉包的解釋,只有短短幾個demo,一大段晦澀難懂的介紹,巴拉巴拉一大段閉包的概念,但是到最後也沒看懂閉包到底是什麽意思,起什麽作用,直到昨晚淩晨,我在學習node.js模塊開發的時候,才突然恍然大悟,所以趕緊記下來,免得以後忘記。代碼來源:廖雪峰的網站node.js教程。
直接上代碼:
我們首先編寫了一個hello.js
文件,這個hello.js
文件就是一個模塊,模塊的名字就是文件名(去掉.js
後綴),所以hello.js
文件就是名為hello
的模塊。
我們把hello.js
改造一下,創建一個函數,這樣我們就可以在其他地方調用這個函數:
‘use strict‘;var s = ‘Hello‘; function greet(name) { console.log(s + ‘, ‘ + name + ‘!‘); } //下面這句代碼暫時先不用管 module.exports = greet;
在這裏我們可以看到直接運行greet();結果會輸出
‘Hello,undefind!‘
這是在意料之中的,因為我們定義了一個全局變量s 然後greet()這個函數使用了變量s。
接下來,我們再編寫一個main.js
文件,調用hello
模塊的greet
函數:
‘use strict‘; // 引入hello模塊,暫時也不用管 //我們可以理解為將hello.js中的greet()方法引用main.js中var greet = require(‘./hello‘); var s = ‘Michael‘; greet(s); // Hello, Michael!
這兩段代碼可以合並成為下面這樣:
var s = ‘Michael‘; (function greet(name) { var s = ‘Hello‘; console.log(s + ‘, ‘ + name + ‘!‘); })(s);
這裏我們就可以發現了,有兩個變量都是s,但是運行結果依然是:
Hello, Michael!
這是為什麽呢,原來我們在不經意間就形成了閉包,只不過自己不知道而已,現在我們再來分析一下上面這段整合完畢的代碼,
var s = ‘Michael‘;//這個是定義的全局變量
var s = ‘Hello‘;//這個是定義在函數greet()的局部變量
閉包就是函數定義了全局變量和局部變量,我們函數內可以調用全局變量,在全局作用域卻無法訪問函數內的變量,我們接下來再稍微改一下代碼
var n = ‘Michael‘; (function greet(name) { var s = ‘Hello‘; console.log(s + ‘, ‘ + name + ‘!‘); })(n); console.log(s);
這樣可以確定已經沒有全局變量s了,那我們這樣直接訪問函數內部的變量s,結果會輸出什麽呢:
Uncaught ReferenceError: s is not defined
這樣我們就可以確信在全局無法訪問函數內的變量了,閉包完成。
如有錯誤請積極指出,十分感謝大家!!
從node.js模塊化開發來了解javascript閉包