Script 腳本

2018-07-11 09:40 更新
Script 類(lèi)可以編譯執(zhí)行JavaScript 代碼。你可以用以下方式訪問(wèn)Script 類(lèi):
var Script = process.binding('evals').Script;

JavaScript 代碼可以被編譯、立刻執(zhí)行或者編譯、保存、延時(shí)執(zhí)行。

Script.runInThisContext(code, [filename])

同process.compile 函數(shù)類(lèi)似,Script.runInThisContext 函數(shù)編譯執(zhí)行code 參數(shù)包含的代碼并返回結(jié)果,就如同這 些代碼是從filename 參數(shù)指定文件中加載的一樣。這些代碼不能訪問(wèn)本地作用域。filename 參數(shù)是可選的。(譯 注:filename 參數(shù)的作用是為了更好的輸出錯(cuò)誤信息)

示例:演示使用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í)行的代碼并不訪問(wèn)本地作用域,所以localVar 變量的值并沒(méi)有改變。eval 函數(shù)執(zhí) 行的代碼可以訪問(wèn)本地作用域,所以localVal 的值被改變了。

如果代碼有語(yǔ)法錯(cuò)誤,Script.runInThisContext 會(huì)輸出錯(cuò)誤信息到控制臺(tái)(stderr)并拋出異常。

Script.runInNewContext(code, [sandbox], [filename])

Script.runInNewContext 將代碼編譯并在sandbox 參數(shù)指定的作用域內(nèi)執(zhí)行代碼并返回結(jié)果,就如同代碼是從文 件中加載的一樣。執(zhí)行的代碼并不訪問(wèn)本地作用域,sandbox 參數(shù)指定的對(duì)象將作為代碼執(zhí)行的全局對(duì)象。 sandbox 和filename 參數(shù)都是可選的。

例子:編譯并執(zhí)行一段代碼,這段代碼遞增并新建一個(gè)全局變量。這些全局變量都保存在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' }

請(qǐng)注意,執(zhí)行不信任的代碼(untrusted code)是一項(xiàng)需要技巧的工作。Script.runInNewContext 函數(shù)非常有用,它可 以在一個(gè)獨(dú)立的線程中執(zhí)行不信任的代碼防止全局變量被意外修改。

如果代碼有語(yǔ)法錯(cuò)誤,Script.runInThisContext 會(huì)輸出錯(cuò)誤信息到控制臺(tái)(stderr)并拋出異常。

new Script(code, [filename])

新建Script 對(duì)象會(huì)編譯code 參數(shù)指定的代碼,就如同代碼是從filename 參數(shù)指定的文件中加載的一樣。和其他 函數(shù)不同的是,它將返回一個(gè)代表經(jīng)過(guò)編譯的代碼的Script 對(duì)象,這個(gè)對(duì)象可以使用下面介紹的函數(shù)執(zhí)行內(nèi)部 編譯好的代碼。這個(gè)script 對(duì)象并不綁定到任何全局對(duì)象,但是可以在運(yùn)行時(shí)綁定到指定對(duì)象,每次綁定僅在 本次運(yùn)行時(shí)生效。filename 參數(shù)是可選的。

如果代碼有語(yǔ)法錯(cuò)誤,new Script emits 會(huì)輸出錯(cuò)誤信息到控制臺(tái)(stderr)并拋出異常。

script.runInThisContext()

這個(gè)函數(shù)和Script.runInThisContext 函數(shù)類(lèi)似(對(duì)象名首字母'S'的大小寫(xiě)不同),不同的是此函數(shù)是Script 對(duì)象的 方法。script.runInThisContext 函數(shù)執(zhí)行對(duì)象中的代碼并返回結(jié)果。執(zhí)行的代碼并不會(huì)訪問(wèn)本地作用域,但是可 以訪問(wèn)全局作用域(v8: in actual context)。

例子:使用script.runInThisContext 函數(shù)實(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ù)類(lèi)似(對(duì)象名首字母'S'的大小寫(xiě)不同),不同的是此函數(shù)是Script 對(duì)象的 方法。script.runInNewContext 函數(shù)將sandbox 參數(shù)指定的對(duì)象作為全局對(duì)象執(zhí)行代碼,并返回結(jié)果。執(zhí)行的代 碼并不訪問(wèn)本地作用域。sandbox 參數(shù)是可選的。

例子:編譯并執(zhí)行一段代碼,這段代碼遞增并新建一個(gè)全局變量,這些全局變量都保存在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' }

請(qǐng)注意,執(zhí)行不信任的代碼(untrusted code)是一項(xiàng)需要技巧的工作。script.runInNewContext 函數(shù)非常有用,它可 以在一個(gè)單獨(dú)的線程中執(zhí)行不信任的代碼防止全局變量被意外修改。

File System 文件系統(tǒng)

(注:同步與異步方式是指同步或異步于程序執(zhí)行,并非函數(shù)彼此之間的同步關(guān)系。) 文件的I/O 是由標(biāo)準(zhǔn)POSIX 函數(shù)封裝而成。需要使用"require('fs')"操作這個(gè)類(lèi)。所有的方法設(shè)有異步方式和同步 方式。

異步形式下的方法其最后一個(gè)參數(shù),總是一個(gè)完整的回調(diào)函數(shù)(callback)。這個(gè)回調(diào)函數(shù)有那些參數(shù),就取決 于異步方法怎么送入?yún)?shù),但通常來(lái)說(shuō),第一個(gè)送入的參數(shù)是異常對(duì)象。如果是沒(méi)有任何問(wèn)題的操作,那么這 個(gè)異常對(duì)象就變?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ù)沒(méi)有一定的順序,所以以下例子容易發(fā)生錯(cuò)誤:

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í)行動(dòng)作繁雜時(shí),強(qiáng)烈建議使用異步方式調(diào)用此類(lèi)。同步方式在其完成之前將會(huì)阻擋一切隨后的動(dòng)作,這代 表擱置所有連接。

fs.rename(path1, path2, [callback])

異步命名(rename(2))。只傳遞異常給回調(diào)函數(shù)。

fs.renameSync(path1, path2)

同步命名(rename(2))。

fs.truncate(fd, len, [callback])

異步截?cái)?ftruncate(2))。只傳遞異常給回調(diào)函數(shù)。

fs.truncateSync(fd, len)

同步截?cái)?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ù)的第二個(gè)參數(shù)是fs.Stats 對(duì)象(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))。如果這個(gè)文件參數(shù)是一個(gè)符號(hào)連接,則返回該符號(hào)連接的屬性?;卣{(diào)函數(shù)的第 二個(gè)參數(shù)是fs.Stats 對(duì)象。(err, stats)

fs.fstat(fd, [callback]) 利用存在的指標(biāo)異步讀取屬性(fstat(2))?;卣{(diào)函數(shù)的第二個(gè)參數(shù)是fs.Stats 對(duì)象。(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])

異步建立符號(hào)連接(symlink(2))。只傳遞異常給回調(diào)函數(shù)。

fs.symlinkSync(linkdata, path)

同步建立符號(hào)連接(symlink(2))。

fs.readlink(path, [callback])

異步讀取連接(readlink(2))。回調(diào)函數(shù)的第二個(gè)參數(shù)是已解析的文件路徑。(err, resolvedPath)

fs.readlinkSync(path)

同步讀取連接(readlink(2))。返回已解析的文件路徑。

fs.realpath(path, [callback])

異步讀取絶對(duì)的路徑名稱(chēng)(realpath(2))。回調(diào)函數(shù)的第二個(gè)參數(shù)是已解析的文件路徑。(err, resolvedPath)

fs.realpathSync(path)

同步讀取絶對(duì)的路徑名稱(chēng)(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ù)的第二個(gè)參數(shù)是以陣列構(gòu)成的目錄內(nèi)對(duì)象的名稱(chēng)('.'與'..'除外)。(err, files)

fs.readdirSync(path)

同步讀取目錄中的內(nèi)容(readdir(3))。返回以陣列構(gòu)成的目錄內(nèi)對(duì)象名稱(chēng)('.'與'..'除外)。

fs.close(fd, [callback])

異步結(jié)束(close(2))。只傳遞異常給回調(diào)函數(shù)

fs.closeSync(fd)

同步結(jié)束(close(2))。

fs.open(path, flags, mode=0666, [callback])

異步開(kāi)啟文件,詳閱open(2)。標(biāo)簽可為'r', 'r+', 'w', 'w+', 'a', 或'a+'。回調(diào)函數(shù)的第二個(gè)參數(shù)是指標(biāo)。(err, fd)

fs.openSync(path, flags, mode=0666)

同步開(kāi)啟文件。

fs.write(fd, buffer, offset, length, position, [callback])

透過(guò)指標(biāo)(fd)寫(xiě)入緩沖區(qū)至文件。 offset 偏移 和 length 長(zhǎng)度 決定哪一部份的緩沖區(qū)被寫(xiě)入。

position 寫(xiě)入位置 若 position 為空,則寫(xiě)入至現(xiàn)存位置。詳閱 pwrite(2)。 回調(diào)函數(shù)的第二個(gè)參數(shù)是寫(xiě)入動(dòng)作的數(shù)據(jù)大小(bytes)。(err, written)

fs.writeSync(fd, buffer, offset, length, position)

fs.write(緩沖區(qū))的同步方式。返回寫(xiě)入動(dòng)作的數(shù)據(jù)大小。

fs.writeSync(fd, str, position, encoding='utf8')

fs.write(字串)的同步方式。返回寫(xiě)入動(dòng)作的數(shù)據(jù)大小。

fs.read(fd, buffer, offset, length, position, [callback])

透過(guò)指標(biāo)(fd)讀取數(shù)據(jù)。

buffer 是讀取的數(shù)據(jù)的存放位置。

offset 是標(biāo)注哪里開(kāi)始寫(xiě)入緩沖區(qū)。

length 是以整數(shù)型態(tài)(INT)標(biāo)注讀取的數(shù)據(jù)大小。

position 是以整數(shù)型態(tài)(INT)標(biāo)注文件的讀取位置。若 position 為空,則由現(xiàn)存位置讀取。 回調(diào)函數(shù)的第二個(gè)參數(shù)是讀取動(dòng)作的數(shù)據(jù)大小(bytes)。(err, bytesRead)

fs.read(fd, length, position, encoding, [callback])

透過(guò)指標(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ù)的第二個(gè)參數(shù)是讀數(shù)的數(shù)據(jù)而第三個(gè)參數(shù)是讀取動(dòng)作的數(shù)據(jù)大小(bytes)。(err, str, bytesRead)

fs.readSync(fd, buffer, offset, length, position)

fs.read(緩沖區(qū))的同步方式。返回讀取動(dòng)作的數(shù)據(jù)大小。

fs.readSync(fd, length, position, encoding)

fs.read(字串)的同步方式。返回讀取動(dòng)作的數(shù)據(jù)大小。

fs.readFile(filename, [encoding], [callback])

透過(guò)文件路徑異步讀取內(nèi)容,例子:

fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});

回調(diào)函數(shù)的第二個(gè)參數(shù)是文件內(nèi)容。(err, datad) 若編碼(encoding)沒(méi)有被指定,則返回原始緩沖區(qū)。

fs.readFileSync(filename, [encoding])

fs.readFile()的同步方式。返回文件內(nèi)容。

若編碼(encoding)被指定,則返回字串,反之則返回原始緩沖區(qū)。

fs.writeFile(filename, data, encoding='utf8', [callback])

異步寫(xiě)入數(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)

觀察文件異變。文件異動(dòng)時(shí)會(huì)觸發(fā)監(jiān)聽(tīng)函數(shù)。

第二個(gè)參數(shù)是可選的。選項(xiàng)(options)參數(shù)應(yīng)為對(duì)象(object),當(dāng)中包含一布林值(BOOL)持續(xù)檢查(persistent)與檢測(cè) 相隔時(shí)間(interval)(單位為毫秒)。

傳遞給監(jiān)聽(tīng)函數(shù)的參數(shù)分別是當(dāng)前狀態(tài)對(duì)象(curr)以及前次狀態(tài)對(duì)象(prev)。

fs.watchFile(f, function (curr, prev) {
console.log('the current mtime is: ' + curr.mtime);
console.log('the previous mtime was: ' + prev.mtime);
});

stat 對(duì)象是fs.Stat 的實(shí)例。

fs.unwatchFile(filename)

停止觀察文件異變。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)