var Script = process.binding('evals').Script;
JavaScript 代碼可以被編譯、立刻執(zhí)行或者編譯、保存、延時執(zhí)行。
Script.runInThisContext(code, [filename])
同process.compile 函數(shù)類似,Script.runInThisContext 函數(shù)編譯執(zhí)行code 參數(shù)包含的代碼并返回結(jié)果,就如同這 些代碼是從filename 參數(shù)指定文件中加載的一樣。這些代碼不能訪問本地作用域。filename 參數(shù)是可選的。(譯 注:filename 參數(shù)的作用是為了更好的輸出錯誤信息)
示例:演示使用Script.runInThisContext 函數(shù)和eval 函數(shù)執(zhí)行同一段代碼:
var localVar = 123,
usingscript, evaled,
Script = process.binding('evals').Script;
usingscript = Script.runInThisContext('localVar = 1;',
'myfile.js');
console.log('localVar: ' + localVar + ', usingscript: ' +
usingscript);
evaled = eval('localVar = 1;');
console.log('localVar: ' + localVar + ', evaled: ' +
evaled);
// localVar: 123, usingscript: 1
// localVar: 1, evaled: 1
Script.runInThisContext 函數(shù)執(zhí)行的代碼并不訪問本地作用域,所以localVar 變量的值并沒有改變。eval 函數(shù)執(zhí) 行的代碼可以訪問本地作用域,所以localVal 的值被改變了。
如果代碼有語法錯誤,Script.runInThisContext 會輸出錯誤信息到控制臺(stderr)并拋出異常。
Script.runInNewContext(code, [sandbox], [filename])
Script.runInNewContext 將代碼編譯并在sandbox 參數(shù)指定的作用域內(nèi)執(zhí)行代碼并返回結(jié)果,就如同代碼是從文 件中加載的一樣。執(zhí)行的代碼并不訪問本地作用域,sandbox 參數(shù)指定的對象將作為代碼執(zhí)行的全局對象。 sandbox 和filename 參數(shù)都是可選的。
例子:編譯并執(zhí)行一段代碼,這段代碼遞增并新建一個全局變量。這些全局變量都保存在sandbox 中。
var sys = require('sys'),
Script = process.binding('evals').Script,
sandbox = {
animal: 'cat',
count: 2
};
Script.runInNewContext(
'count += 1; name = "kitty"', sandbox, 'myfile.js');
console.log(sys.inspect(sandbox));
// { animal: 'cat', count: 3, name: 'kitty' }
請注意,執(zhí)行不信任的代碼(untrusted code)是一項需要技巧的工作。Script.runInNewContext 函數(shù)非常有用,它可 以在一個獨立的線程中執(zhí)行不信任的代碼防止全局變量被意外修改。
如果代碼有語法錯誤,Script.runInThisContext 會輸出錯誤信息到控制臺(stderr)并拋出異常。
new Script(code, [filename])
新建Script 對象會編譯code 參數(shù)指定的代碼,就如同代碼是從filename 參數(shù)指定的文件中加載的一樣。和其他 函數(shù)不同的是,它將返回一個代表經(jīng)過編譯的代碼的Script 對象,這個對象可以使用下面介紹的函數(shù)執(zhí)行內(nèi)部 編譯好的代碼。這個script 對象并不綁定到任何全局對象,但是可以在運行時綁定到指定對象,每次綁定僅在 本次運行時生效。filename 參數(shù)是可選的。
如果代碼有語法錯誤,new Script emits 會輸出錯誤信息到控制臺(stderr)并拋出異常。
script.runInThisContext()
這個函數(shù)和Script.runInThisContext 函數(shù)類似(對象名首字母'S'的大小寫不同),不同的是此函數(shù)是Script 對象的 方法。script.runInThisContext 函數(shù)執(zhí)行對象中的代碼并返回結(jié)果。執(zhí)行的代碼并不會訪問本地作用域,但是可 以訪問全局作用域(v8: in actual context)。
例子:使用script.runInThisContext 函數(shù)實現(xiàn)代碼的一次編譯多次執(zhí)行。
var Script = process.binding('evals').Script,
scriptObj, i;
globalVar = 0;
scriptObj = new Script('globalVar += 1', 'myfile.js');
for (i = 0; i < 1000 ; i += 1) {
scriptObj.runInThisContext();
}
console.log(globalVar);
// 1000
script.runInNewContext([sandbox])
此函數(shù)和Script.runInNewContext 函數(shù)類似(對象名首字母'S'的大小寫不同),不同的是此函數(shù)是Script 對象的 方法。script.runInNewContext 函數(shù)將sandbox 參數(shù)指定的對象作為全局對象執(zhí)行代碼,并返回結(jié)果。執(zhí)行的代 碼并不訪問本地作用域。sandbox 參數(shù)是可選的。
例子:編譯并執(zhí)行一段代碼,這段代碼遞增并新建一個全局變量,這些全局變量都保存在sandbox 中。然后多次執(zhí)行這段代碼,這些全局變量都保存在沙盒(sandbox)中。
var sys = require('sys'),
Script = process.binding('evals').Script,
scriptObj, i,
sandbox = {
animal: 'cat',
count: 2
};
scriptObj = new Script(
'count += 1; name = "kitty"', 'myfile.js');
for (i = 0; i < 10 ; i += 1) {
scriptObj.runInNewContext(sandbox);
}
console.log(sys.inspect(sandbox));
// { animal: 'cat', count: 12, name: 'kitty' }
請注意,執(zhí)行不信任的代碼(untrusted code)是一項需要技巧的工作。script.runInNewContext 函數(shù)非常有用,它可 以在一個單獨的線程中執(zhí)行不信任的代碼防止全局變量被意外修改。
(注:同步與異步方式是指同步或異步于程序執(zhí)行,并非函數(shù)彼此之間的同步關(guān)系。) 文件的I/O 是由標(biāo)準(zhǔn)POSIX 函數(shù)封裝而成。需要使用"require('fs')"操作這個類。所有的方法設(shè)有異步方式和同步 方式。
異步形式下的方法其最后一個參數(shù),總是一個完整的回調(diào)函數(shù)(callback)。這個回調(diào)函數(shù)有那些參數(shù),就取決 于異步方法怎么送入?yún)?shù),但通常來說,第一個送入的參數(shù)是異常對象。如果是沒有任何問題的操作,那么這 個異常對象就變?yōu)閚ull 或者undefined,表示操作正常。 異步方式的例子:
var fs = require('fs');
fs.unlink('/tmp/hello', function (err) {
if (err) throw err;
console.log('successfully deleted /tmp/hello');
});
同步方式的例子:
var fs = require('fs');
fs.unlinkSync('/tmp/hello')
console.log('successfully deleted /tmp/hello');
異步函數(shù)沒有一定的順序,所以以下例子容易發(fā)生錯誤:
fs.rename('/tmp/hello', '/tmp/world', function (err) {
if (err) throw err;
console.log('renamed complete');
});
fs.stat('/tmp/world', function (err, stats) {
if (err) throw err;
console.log('stats: ' + JSON.stringify(stats));
});
這有可能fs.state 于fs.rename 前執(zhí)行。正確的做法是嵌套回傳函數(shù)。
fs.rename('/tmp/hello', '/tmp/world', function (err) {
if (err) throw err;
fs.stat('/tmp/world', function (err, stats) {
if (err) throw err;
console.log('stats: ' + JSON.stringify(stats));
});
});
當(dāng)執(zhí)行動作繁雜時,強(qiáng)烈建議使用異步方式調(diào)用此類。同步方式在其完成之前將會阻擋一切隨后的動作,這代 表擱置所有連接。
fs.rename(path1, path2, [callback])
異步命名(rename(2))。只傳遞異常給回調(diào)函數(shù)。
fs.renameSync(path1, path2)
同步命名(rename(2))。
fs.truncate(fd, len, [callback])
異步截斷(ftruncate(2))。只傳遞異常給回調(diào)函數(shù)。
fs.truncateSync(fd, len)
同步截斷(ftruncate(2))。
fs.chmod(path, mode, [callback])
異步更改文件權(quán)限(chmod(2))。只傳遞異常給回調(diào)函數(shù)。
fs.chmodSync(path, mode)
同步更改文件權(quán)限(chmod(2))。
fs.stat(path, [callback])
利用路徑異步讀取屬性(stat(2))?;卣{(diào)函數(shù)的第二個參數(shù)是fs.Stats 對象(err, stats),例如:
{ dev: 2049
, ino: 305352
, mode: 16877
, nlink: 12
, uid: 1000
, gid: 1000
, rdev: 0
, size: 4096
, blksize: 4096
, blocks: 8
, atime: '2009-06-29T11:11:55Z'
, mtime: '2009-06-29T11:11:40Z'
, ctime: '2009-06-29T11:11:40Z'
}
參考fs.Stats 部份以取得詳細(xì)資料。
fs.lstat(path, [callback])
利用路徑異步讀取屬性(lstat(2))。如果這個文件參數(shù)是一個符號連接,則返回該符號連接的屬性?;卣{(diào)函數(shù)的第 二個參數(shù)是fs.Stats 對象。(err, stats)
fs.fstat(fd, [callback]) 利用存在的指標(biāo)異步讀取屬性(fstat(2))?;卣{(diào)函數(shù)的第二個參數(shù)是fs.Stats 對象。(err, stats)
fs.statSync(path)
同步讀取屬性(stat(2))。返回fs.Stats。
fs.lstatSync(path)
利用路徑同步讀取屬性(lstat(2))。返回fs.Stats。
fs.fstatSync(fd)
利用存在的指標(biāo)同步讀取屬性(fstat(2))。返回fs.Stats。
fs.link(srcpath, dstpath, [callback])
異步建立連接(link(2))。只傳遞異常給回調(diào)函數(shù)。
fs.linkSync(dstpath, srcpath)
同步建立連接(link(2))。
fs.symlink(linkdata, path, [callback])
異步建立符號連接(symlink(2))。只傳遞異常給回調(diào)函數(shù)。
fs.symlinkSync(linkdata, path)
同步建立符號連接(symlink(2))。
fs.readlink(path, [callback])
異步讀取連接(readlink(2))?;卣{(diào)函數(shù)的第二個參數(shù)是已解析的文件路徑。(err, resolvedPath)
fs.readlinkSync(path)
同步讀取連接(readlink(2))。返回已解析的文件路徑。
fs.realpath(path, [callback])
異步讀取絶對的路徑名稱(realpath(2))?;卣{(diào)函數(shù)的第二個參數(shù)是已解析的文件路徑。(err, resolvedPath)
fs.realpathSync(path)
同步讀取絶對的路徑名稱(realpath(2))。返回已解析的文件路徑。
fs.unlink(path, [callback])
異步刪除連接(~=刪除文件)(unlink(2))。只傳遞異常給回調(diào)函數(shù)。
fs.unlinkSync(path)
同步刪除連接(~=刪除文件)(unlink(2))。
fs.rmdir(path, [callback])
異步刪除目錄(rmdir(2))。只傳遞異常給回調(diào)函數(shù)。
fs.rmdirSync(path)
同步刪除目錄(rmdir(2))。
fs.mkdir(path, mode, [callback])
異步建立目錄(mkdir(2))。只傳遞異常給回調(diào)函數(shù)。
fs.mkdirSync(path, mode)
同步建立目錄(mkdir(2))。
fs.readdir(path, [callback])
異步讀取目錄中的內(nèi)容(readdir(3))。回調(diào)函數(shù)的第二個參數(shù)是以陣列構(gòu)成的目錄內(nèi)對象的名稱('.'與'..'除外)。(err, files)
fs.readdirSync(path)
同步讀取目錄中的內(nèi)容(readdir(3))。返回以陣列構(gòu)成的目錄內(nèi)對象名稱('.'與'..'除外)。
fs.close(fd, [callback])
異步結(jié)束(close(2))。只傳遞異常給回調(diào)函數(shù)
fs.closeSync(fd)
同步結(jié)束(close(2))。
fs.open(path, flags, mode=0666, [callback])
異步開啟文件,詳閱open(2)。標(biāo)簽可為'r', 'r+', 'w', 'w+', 'a', 或'a+'?;卣{(diào)函數(shù)的第二個參數(shù)是指標(biāo)。(err, fd)
fs.openSync(path, flags, mode=0666)
同步開啟文件。
fs.write(fd, buffer, offset, length, position, [callback])
透過指標(biāo)(fd)寫入緩沖區(qū)至文件。 offset 偏移 和 length 長度 決定哪一部份的緩沖區(qū)被寫入。
position 寫入位置 若 position 為空,則寫入至現(xiàn)存位置。詳閱 pwrite(2)。 回調(diào)函數(shù)的第二個參數(shù)是寫入動作的數(shù)據(jù)大小(bytes)。(err, written)
fs.writeSync(fd, buffer, offset, length, position)
fs.write(緩沖區(qū))的同步方式。返回寫入動作的數(shù)據(jù)大小。
fs.writeSync(fd, str, position, encoding='utf8')
fs.write(字串)的同步方式。返回寫入動作的數(shù)據(jù)大小。
fs.read(fd, buffer, offset, length, position, [callback])
透過指標(biāo)(fd)讀取數(shù)據(jù)。
buffer 是讀取的數(shù)據(jù)的存放位置。
offset 是標(biāo)注哪里開始寫入緩沖區(qū)。
length 是以整數(shù)型態(tài)(INT)標(biāo)注讀取的數(shù)據(jù)大小。
position 是以整數(shù)型態(tài)(INT)標(biāo)注文件的讀取位置。若 position 為空,則由現(xiàn)存位置讀取。 回調(diào)函數(shù)的第二個參數(shù)是讀取動作的數(shù)據(jù)大小(bytes)。(err, bytesRead)
fs.read(fd, length, position, encoding, [callback])
透過指標(biāo)(fd)讀取數(shù)據(jù)。
length 是以整數(shù)型態(tài)(INT)標(biāo)注讀取的數(shù)據(jù)大小。
position 是以整數(shù)型態(tài)(INT)標(biāo)注文件的讀取位置。若 position 為空,則由現(xiàn)存位置讀取。
encoding 是讀取數(shù)據(jù)的預(yù)期編碼。 回調(diào)函數(shù)的第二個參數(shù)是讀數(shù)的數(shù)據(jù)而第三個參數(shù)是讀取動作的數(shù)據(jù)大小(bytes)。(err, str, bytesRead)
fs.readSync(fd, buffer, offset, length, position)
fs.read(緩沖區(qū))的同步方式。返回讀取動作的數(shù)據(jù)大小。
fs.readSync(fd, length, position, encoding)
fs.read(字串)的同步方式。返回讀取動作的數(shù)據(jù)大小。
fs.readFile(filename, [encoding], [callback])
透過文件路徑異步讀取內(nèi)容,例子:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
回調(diào)函數(shù)的第二個參數(shù)是文件內(nèi)容。(err, datad) 若編碼(encoding)沒有被指定,則返回原始緩沖區(qū)。
fs.readFileSync(filename, [encoding])
fs.readFile()的同步方式。返回文件內(nèi)容。
若編碼(encoding)被指定,則返回字串,反之則返回原始緩沖區(qū)。
fs.writeFile(filename, data, encoding='utf8', [callback])
異步寫入數(shù)據(jù)至文件,data(數(shù)據(jù))可以為字串或緩沖區(qū)。 例子:
fs.writeFile('message.txt', 'Hello Node', function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
fs.writeFileSync(filename, data, encoding='utf8')
fs.writeFile()的同步方式。
fs.watchFile(filename, [options], listener)
觀察文件異變。文件異動時會觸發(fā)監(jiān)聽函數(shù)。
第二個參數(shù)是可選的。選項(options)參數(shù)應(yīng)為對象(object),當(dāng)中包含一布林值(BOOL)持續(xù)檢查(persistent)與檢測 相隔時間(interval)(單位為毫秒)。
傳遞給監(jiān)聽函數(shù)的參數(shù)分別是當(dāng)前狀態(tài)對象(curr)以及前次狀態(tài)對象(prev)。
fs.watchFile(f, function (curr, prev) {
console.log('the current mtime is: ' + curr.mtime);
console.log('the previous mtime was: ' + prev.mtime);
});
stat 對象是fs.Stat 的實例。
fs.unwatchFile(filename)
停止觀察文件異變。
更多建議: