前端面试题

问题一:面向对象-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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容