欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前端面试题

程序员文章站 2022-03-04 11:58:38
...

问题一:面向对象-new时的初始值
<pre>
function C1(name){
if(name)this.name = name;
}
function C2(name){
this.name = name;
}
function C3(name){
this.name = name||'john';
}
C1.prototype.name = 'tom';
C2.prototype.name = 'tom';
C3.prototype.name = 'tom';
//3个使用new操作符时,都没有传入初始变量
alert ((new C1()).name + (new C2()).name + (new C3()).name);
</pre>
这道题得到的结果:tomundefinedjohn;
分析:
C1,if不成立,new C1()中没有name属性,就访问到了原型上的name,输出tom
C2,既然没有参数,也就是执行new C2(undefined),所以name为undefined
C3,new C3()的name值为john,所输出john
延伸:
当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。
首先从对象本身搜索,如果找到了,返回该属性的值;如果没有找到会继续搜索指针指向的原型。

问题二:this的指向

window.val = 1;
var json = {
    val:10,
   dbl: function () {
      this.val*=2;
    }
};
//db1作为方法调用,此时this为json json.val=20 (10*2)
json.dbl();
//db1函数赋值给db1变量后,此时的db1是一个普通的函数
var dbl = json.dbl;
//普通函数调用,this指向window ,window.val为 2 (1*2)
dbl();
//Function的call方法调用,指定this为window,使用apply也类似 window.val为 4 (2*2) 
json.dbl.call(window);
//所以结果为 24
alert(window.val+json.val);

问题三:闭包

var test = (function (i) {
 return function(){
alert(i*2);
};
}(2));
//test通过一个立即执行函数返回了一个匿名闭包函数,这个匿名闭包函数绑定了执行是传入的参数2
//且匿名闭包函数没有对传入自身的参数有特殊处理(利用arguments属性)
//所以test(5)和test()等价
test(5);