关于js函数面试题

1.x = 1;
var obj = {
    x: 2,
    dbl: function () {
        this.x *= 2;
        x *= 2;
        console.log(x);
        console.log(this.x);
    }
};
// 说出下面的输出结果
obj.dbl();
//解析:this.x指向当前对象,所以this.x *= 2等同于obj.x *= 2
//而x *= 2,在当前作用域中没有找到声明,则在全局作用域下查找是否有x, x *= 2等同于window.x *= 2
//日志打印输出2 4,此时window.x为2, obj.x为4

var func = obj.dbl;
func();
//func()没有前缀,所以func()相当于window.func(),此时func()中的x与this.x均指向window.x
//日志打印输出8 8,此时window.x为8, obj.x为4


var funcBind = obj.dbl.bind(obj);
funcBind();
//func()没有前缀,但是因为通过bind()方法,把funcBind()的作用域与obj的作用域绑定起来,所以func()相当于obj.dbl(),其中x作用域与上面??一样查找x,只不过此时window.x为8, obj.x为4
//日志打印输出16 8
 2.   var foo = {n:1};
    (function (foo) {
        console.log(foo.n);
        foo.n=3;
        var foo = {n:2};
        console.log(foo.n);
    })(foo);
    console.log(foo.n); 
1,声明一个变量,为引用类型
2,、声明一个匿名函数,并立即执行,传递的参数是第1行中的foo。将一个对象类型赋值给一个新的变量,由于对象是引用类型,实质上是指将对象的地址赋值给该变量(也就是说这两个变量指向同一个地址空间),因此改变新的变量中的属性值或方法,对应的原来对象的值也会改变。
3、原题中的第5行,由于存在变量提升,因此会在函数开始就声明,此时为undefined;然而由于一个变量的声明优先级低于形参,所以这行没有任何效果
4、打印形参的foo.n,打印1
5、改变第1行变量foo的属性n的值为36、重新声明并定义了一个变量,开辟了新的内存空间,n为2
7、由于js中的代码是自上而下执行,所以此时输出2
9、上面的函数调用结束后,局部变量被销毁,而之前的内存空间值已经变为3,所以输出3
所以最终的结果为:1 2 3

3.var User = {
 count: 1,
 getCount: function() {
  return this.count;
 }
};
console.log(User.getCount()); // what?
var func = User.getCount;
console.log(func()); // what?
问两处console输出什么?为什么?
答案:1和undefined。
  func是在window的上下文中被执行的,所以不会访问到count属性。


4.var a = null;
alert(typeof a);
答案:object
解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
5.运行以下程序,y和z的最终结果?
var m= 1, j = k = 0;
function add(n) {
  return n = n+1;
}
y = add(m);
function add(n) {
  return n = n + 3;
}
z = add(m);
答案:4 4

解析:由于函数声明提升,所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数


6.以下代码的输出结果是?
var f = function g() {
        return 23;
    };
typeof g();
答案:error

解析:
在 JS 里,声明函数只有 2 种方法:
第 1 种: function foo(){...} (函数声明)
第 2 种: var foo = function(){...} (等号后面必须是匿名函数,这句实质是函数表达式)
除此之外,类似于 var foo = function bar(){...} 这样的东西统一按 2 方法处理,即在函数外部无法通过 bar 访问到函数,因为这已经变成了一个表达式。
但为什么不是 "undefined"?
这里如果求 typeof g ,会返回 undefined,但求的是 g(),所以会去先去调用函数 g,这里就会直接抛出异常,所以是 Error。

7.(function() {
var x=foo();
var foo=function foo() {
return “foobar”
};
return x;
})();
答案:TypeError: foo is not a function

解析:
foo变量“被提前”了,但是他的赋值(也就是函数)并没有被提前,从这一点上来说,和前面我们所讲的变量“被提前”是完全一致的,并且,由于“被提前”的变量的默认值是 undefined。
函数声明可以被提前,但函数表达式不能被提前



8.希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)
  var inputs = document.getElementsByTagName("input");//获取所有的input标签对象

  var checkboxArray = [];//初始化空数组,用来存放checkbox对象。

	for(var i=0;i<inputs.length;i++){
  
		var obj = inputs[i];
  
			if(obj.type=='checkbox'){
    
				 checkboxArray.push(obj);
  
				}
}



9.function foo() {
    var a = 2;
    function baz() { 
        console.log( a );
    }
    return baz;
}
var fn = foo()
fn();//2


10.var getName;
 function Foo(){
 	getName = function(){
 		alert(1);
 	}
 	return this;
 }	
 getName = function(){
 	alert(4);
 }
Foo().getName();
解析:
	Foo( )返回的是指向window的this
this.getNam( )查找的是window中属性为getName的函数
getName在Foo( )时被重新设置,故输出为1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值