前端面试题之函数

前端面试题之函数

今天我们来讲讲面试题中的关于函数的题

第一题

思考以下代码:控制台(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值