前端面试题之函数
今天我们来讲讲面试题中的关于函数的题
第一题
思考以下代码:控制台(console)会打印出什么?
(function(){
var a = b = 5;
})();
console.log(b);
控制台输出
解题思路:这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个命名,但是其中变量是通过关键词var来声明的。这就意味着a是这个函数的局部变量。与此相反,b是在全局作用域下的。这个问题另一个陷阱就是,在函数中他没有使用"严格模式" (‘use strict’;)。如果 严格模式 开启,那么代码就会报出未捕获引用错误(Uncaught ReferenceError):b没有定义。记住,严格模式要求你在需要使用全局变量时,明确地引用该变量。因此,你需要像下面这么写:
(function(){
'use strict'
var a = window.b = 5;
})();
console.log(b);
第二题
思考以下代码:控制台(console)会打印出什么?
function setupSomeGlobals() {
var num = 666;
gAlertNumber = function() { console.log(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}
setupSomeGlobals();
gAlertNumber();
gIncreaseNumber();
gAlertNumber();
gSetNumber(5);
gAlertNumber();
控制台输出
解题思路:首先gAlertNumber,gIncreaseNumber,gSetNumber是三个全局变量,并且其三个值都是匿名函数,然而这三个匿名函数本身都是闭包。他们操作的num都是保存在内存中的同一个num。
第三题
分析下面代码,函数执行时控制台会输出什么?
function sayHello(name)
{
var text = 'Hello ' + name;
var sayAlert = function() { console.log(text); }
sayAlert();
}
sayHello("Bob") ;
会输出:Hello Bob
解题思路:在sayHello()函数中定义并调用了sayAlert()函数;sayAlert()作为内层函数,可以访问外层函数sayHello()中的text变量。
第四题
分析代码
var fn = function () {
console.log(fn)
}
fn()
var obj = {
fn2: function () {
console.log(fn2)
}
}
obj.fn2()
var obj = {
fn3: function () {
console.log(this.fn3);
}
}
obj.fn3()
控制台输出:
第五题
写一个function,清除字符串前后的空格。(兼容所有浏览器)
String.prototype.Trim = function () {
return this.replace(/(^\s*)|(\s*$)/g, '');
};
第六题
js中有一个函数,执行对象查找时,永远不会去查找原型,这个函数是什么?
答: hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。该方法属于Object对象,由于所有的对象都”继承”了Object的对象实例,因此几乎所有的实例对象都可以使用该方法。
第七题
什么是构造函数?与普通函数有什么区别?
答:构造函数:是一种特殊的方法、主要用来创建对象时初始化对象,总与new运算符一起使用,创建对象的语句中构造函数的函数名必须与类名完全相同。与普通函数相比只能由new关键字调用,构造函数是类的标示。
第八题
this是什么 在不同场景中分别代表什么
答:(1)function a(){ this ?} //This:指向windows
(2)function b(){ return function(){ this ?}}b()(); //This:指向windows
(3)function c(){ return {s:function(){this}}}c().s(); //This:指向object
由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。
第九题
以下两种方式调用函数是,alert的结果是?
var foo=1;
function main(){
alert(foo);
var foo=2;
alert(this.foo);
this.foo=3;}
main(); //输出undefined,1
new main(); //输出undefined,undefined
解题思路:function main(){ };这种形式是声明一个函数,跟 var一个变量的机制一样,脚本在解释执行之前会做预编译处理,
而var main = function(){};这种形式是对一个变量赋值,虽然也做预编译,
但仅仅只是给 main事先变量分配一个内存空间,而没有做初始化;关于声明提升是指:js在解析的时候总是会将var,function这类关键词的声明语句提升至该作用域的最顶部(注意:这里只会提升声明部分)。
第十题
什么是函数柯里化?**
答:属于高阶函数应用,传递给函数部分参数来调用柯里化函数,让它返回一个函数去处理剩下的参数。 把接受多个参数的函数转换成接受一个单一参数的函数。
// 柯里化
var foo = function(x) {
return function(y) {
return x + y
}
}
foo(3)(4) // 7
// 普通方法
var add = function(x, y) {
return x + y;
}
add(3,4) //7