1. 程式人生 > >從node.js模塊化開發來了解javascript閉包

從node.js模塊化開發來了解javascript閉包

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閉包