問(wèn)題1:JavaScript 中 undefined 和 not defined 的區(qū)別
JavaScript 未聲明變量直接使用會(huì)拋出異常:var name is not defined,如果沒(méi)有處理異常,代碼就停止運(yùn)行了。 但是,使用typeof undeclared_variable并不會(huì)產(chǎn)生異常,會(huì)直接返回 undefined。
var x; // 聲明 xconsole.log(x); //output: undefined console.log(typeof y); //output: undefined console.log(z); // 拋出異常: ReferenceError: z is not defined
問(wèn)題2:下面的代碼輸出什么?
var y = 1;if (function f(){}) { y += typeof f;}console.log(y);正確的答案應(yīng)該是 1undefined。
JavaScript中if語(yǔ)句求值其實(shí)使用eval函數(shù),eval(function f(){}) 返回 function f(){} 也就是 true。
下面我們可以把代碼改造下,變成其等效代碼。
var k = 1;if (1) { eval(function foo(){}); k += typeof foo;}console.log(k); 上面的代碼輸出其實(shí)就是 1undefined。為什么那?我們查看下 eval() 說(shuō)明文檔即可獲得答案
該方法只接受原始字符串作為參數(shù),如果 string 參數(shù)不是原始字符串,那么該方法將不作任何改變地返回。
恰恰 function f(){} 語(yǔ)句的返回值是 undefined,所以一切都說(shuō)通了。
注意上面代碼和以下代碼不同。
var k = 1;if (1) { function foo(){}; k += typeof foo;}console.log(k); // output 1function問(wèn)題3:在JavaScript中創(chuàng)建一個(gè)真正的private方法有什么缺點(diǎn)?
每一個(gè)對(duì)象都會(huì)創(chuàng)建一個(gè)private方法的方法,這樣很耗費(fèi)內(nèi)存
觀察下面代碼
var Employee = function (name, company, salary) { this.name = name || ""; this.company = company || ""; this.salary = salary || 5000; // Private method var increaseSalary = function () { this.salary = this.salary + 1000; }; // Public method this.dispalyIncreasedSalary = function() { increaseSlary(); console.log(this.salary); };};// Create Employee class objectvar emp1 = new Employee("John","Pluto",3000);// Create Employee class objectvar emp2 = new Employee("Merry","Pluto",2000);// Create Employee class objectvar emp3 = new Employee("Ren","Pluto",2500);在這里 emp1,emp2,emp3都有一個(gè)increaseSalary私有方法的副本。
所以我們除非必要,非常不推薦使用私有方法。
問(wèn)題4:JavaScript中什么是閉包?寫出一個(gè)例子
老生常談的問(wèn)題了,閉包是在一個(gè)函數(shù)里聲明了另外一個(gè)函數(shù),并且這個(gè)函數(shù)訪問(wèn)了父函數(shù)作用域里的變量。
下面給出一個(gè)閉包例子,它訪問(wèn)了三個(gè)域的變量
var globalVar = "abc"; // Parent self invoking function (function outerFunction (outerArg) { // begin of scope outerFunction // Variable declared in outerFunction function scope var outerFuncVar = 'x'; // Closure self-invoking function (function innerFunction (innerArg) { // begin of scope innerFunction // variable declared in innerFunction function scope var innerFuncVar = "y"; console.log( "outerArg = " + outerArg + "n" + "outerFuncVar = " + outerFuncVar + "n" + "innerArg = " + innerArg + "n" + "innerFuncVar = " + innerFuncVar + "n" + "globalVar = " + globalVar); }// end of scope innerFunction)(5); // Pass 5 as parameter }// end of scope outerFunction )(7); // Pass 7 as parameter innerFunction is closure that is defined inside outerFunc
新聞熱點(diǎn)
疑難解答
圖片精選