1、為什么用Nodejs,它有哪些優(yōu)缺點旱眯?
優(yōu)點:
事件驅(qū)動晨川,通過閉包很容易實現(xiàn)客戶端的生命活期证九。
不用擔心多線程,鎖共虑,并行計算的問題
V8引擎速度非忱⒘快
對于游戲來說,寫一遍游戲邏輯代碼看蚜,前端后端通用
缺點:
nodejs更新很快,可能會出現(xiàn)版本兼容
nodejs還不算成熟赔桌,還沒有大制作
nodejs不像其他的服務(wù)器供炎,對于不同的鏈接,不支持進程和線程操作
2疾党、什么是錯誤優(yōu)先的回調(diào)函數(shù)音诫?
錯誤優(yōu)先(Error-first)的回調(diào)函數(shù)(Error-First Callback)用于同時返回錯誤和數(shù)據(jù)。
第一個參數(shù)返回錯誤雪位,并且驗證它是否出錯竭钝;其他參數(shù)返回數(shù)據(jù)。
fs.readFile(filePath, function(err, data)
{
if (err)
{
// 處理錯誤
return console.log(err);
}
console.log(data);
});
3雹洗、使用NPM有哪些好處香罐?
通過NPM,你可以安裝和管理項目的依賴时肿,
并且能夠指明依賴項的具體版本號庇茫。
對于Node應(yīng)用開發(fā)而言,
你可以通過package.json文件來管理項目信息螃成,
配置腳本旦签,以及指明依賴的具體版本
4、在JavaScript源文件的開頭包含 use strict 有什么意義和好處寸宏?
對于這個問題宁炫,
既簡要又最重要的答案是,
use strict 是一種在JavaScript代碼運行時自動實行更嚴格解析和錯誤處理的方法氮凝。
那些被忽略或默默失敗了的代碼錯誤羔巢,會產(chǎn)生錯誤或拋出異常。
通常而言罩阵,這是一個很好的做法朵纷。
嚴格模式的一些主要優(yōu)點包括:
使調(diào)試更加容易。
那些被忽略或默默失敗了的代碼錯誤永脓,會產(chǎn)生錯誤或拋出異常袍辞,
因此盡早提醒你代碼中的問題,
你才能更快地指引到它們的源代碼常摧。
防止意外的全局變量搅吁。
如果沒有嚴格模式威创,
將值分配給一個未聲明的變量會自動創(chuàng)建該名稱的全局變量。
這是JavaScript中最常見的錯誤之一谎懦。
在嚴格模式下肚豺,這樣做的話會拋出錯誤。
消除 this 強制界拦。
如果沒有嚴格模式吸申,
引用null或未定義的值到 this 值會自動強制到全局變量。
這可能會導(dǎo)致許多令人頭痛的問題和讓人恨不得拔自己頭發(fā)的bug享甸。
在嚴格模式下截碴,
引用 null或未定義的 this 值會拋出錯誤。
不允許重復(fù)的屬性名稱或參數(shù)值蛉威。
當檢測到對象
(例如日丹,var object = {foo: "bar", foo: "baz"};)
中重復(fù)命名的屬性,或檢測到函數(shù)中
(例如蚯嫌,function foo(val1, val2, val1){})重復(fù)命名的參數(shù)時哲虾,
嚴格模式會拋出錯誤,
因此捕捉幾乎可以肯定是代碼中的bug可以避免浪費大量的跟蹤時間择示。
使eval() 更安全束凑。
在嚴格模式和非嚴格模式下,eval() 的行為方式有所不同栅盲。
最顯而易見的是湘今,在嚴格模式下,
變量和聲明在 eval() 語句內(nèi)部的函數(shù)不會在包含范圍內(nèi)創(chuàng)建
(它們會在非嚴格模式下的包含范圍中被創(chuàng)建剪菱,這也是一個常見的問題源)摩瞎。
在 delete使用無效時拋出錯誤。
delete操作符(用于從對象中刪除屬性)不能用在對象不可配置的屬性上孝常。
當試圖刪除一個不可配置的屬性時旗们,
非嚴格代碼將默默地失敗,
而嚴格模式將在這樣的情況下拋出異常构灸。
5上渴、JavaScript中的“閉包”是什么?請舉一個例子?
閉包是一個可以訪問外部(封閉)函數(shù)作用域鏈中的變量的內(nèi)部函數(shù)喜颁。
閉包可以訪問三種范圍中的變量:
這三個范圍具體為:
(1)自己范圍內(nèi)的變量稠氮,
(2)封閉函數(shù)范圍內(nèi)的變量,以及
(3)全局變量半开。
下面是一個簡單的例子:
var globalVar = "xyz";
(function outerFunc(outerArg) {
var outerVar = 'a';
(function innerFunc(innerArg) {
var innerVar = 'b';
console.log(
"outerArg = " + outerArg + "\n" +
"innerArg = " + innerArg + "\n" +
"outerVar = " + outerVar + "\n" +
"innerVar = " + innerVar + "\n" +
"globalVar = " + globalVar);
})(456);
})(123);
在上面的例子中隔披,來自于 innerFunc,
outerFunc和全局命名空間的變量都在 innerFunc的范圍內(nèi)寂拆。
因此奢米,上面的代碼將輸出如下:
outerArg = 123
innerArg = 456
outerVar = a
innerVar = b
globalVar = xyz