问题1:JavaScript 中 undefined 和 not defined 的区别
JavaScript 未声明变量直接使用会抛出异常:var name is not defined,如果没有处理异常,代码就停止运行了。 但是,使用typeof undeclared_variable并不会产生异常,会直接返回 undefined。
var x; // 声明 xconsole.log(x); //output: undefined console.log(typeof y); //output: undefined console.log(z); // 抛出异常: ReferenceError: z is not defined
问题2:下面的代码输出什么?
var y = 1;if (function f(){}) { y += typeof f;}console.log(y);
正确的答案应该是 1undefined。
JavaScript中if语句求值其实使用eval函数,eval(function f(){}) 返回 function f(){} 也就是 true。
下面我们可以把代码改造下,变成其等效代码。
var k = 1;if (1) { eval(function foo(){}); k += typeof foo;}console.log(k);
上面的代码输出其实就是 1undefined。为什么那?我们查看下 eval() 说明文档即可获得答案
该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。
恰恰 function f(){} 语句的返回值是 undefined,所以一切都说通了。
注意上面代码和以下代码不同。
var k = 1;if (1) { function foo(){}; k += typeof foo;}console.log(k); // output 1function
问题3:在JavaScript中创建一个真正的private方法有什么缺点?
每一个对象都会创建一个private方法的方法,这样很耗费内存
观察下面代码
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都有一个increaseSalary私有方法的副本。
所以我们除非必要,非常不推荐使用私有方法。
问题4:JavaScript中什么是闭包?写出一个例子
老生常谈的问题了,闭包是在一个函数里声明了另外一个函数,并且这个函数访问了父函数作用域里的变量。
下面给出一个闭包例子,它访问了三个域的变量
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
新闻热点
疑难解答
图片精选