阿里巴巴在线笔试题汇总
2013阿里巴巴前端在线笔试题
1、现有代码如下:
var foo = 1;
function main(){
alert(foo);
var foo = 2;
alert(this.foo)
this.foo = 3;
}
1.请给出以下两种方式调用函数时,alert的结果,并说明原因。
var m1 = main();
var m2 = new main();
2.如果想要var m1 = main()产生的m1和前面的m2完全一致,又该如何改造main函数?
答案:
- 1、var m1=main()时,alert的结果是undefined和1,原因是首先在alert(foo)的时候,foo在main()函数域内还没有被定义(这里作者说错了,不是没有定义,是局部变量还没有赋值,变量声明时会提前的),因此提示undefined,而在输出this.foo时,因为此时的函数执行环境是全局域,相当于
window.main()
,因此this=window
,所以this.foo=window.foo=1。
*var m2=new main()时,alert的结果是undefined和undefined,第一个undefined的原因与前面一种情况相同,而第二个提示undefined的原因是在这种情况下用new构造了一个main()的实例,因此执行环境发生了改变,不再是全局域,而是m2,因此此时的this=m2,因此this.foo=m2.foo,但是由于在alert(this.foo)时,m2中的this.foo还未被定义,因此提示undefined - 注意:全局环境下定义的变量会被当做全局对象的属性:如在1中alert(this.main)也会有结果。但是在局部环境下就不是了,局部变量不会被当做对象的属性。如:foo就不是main的属性。
2、如果你现在使用的是 Google Chrome 或 Apple Safari,如何让 input 元素在默认情况下显示 “alipay WD Team”,而在光标移入后则显示空白?
<input id='test' type='text' placeholder='alipay WD Team' />
<script>
document.getElementById('test').function(){
this.value=" "};
</script>
3、写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推;
方法一:
<a href="#">第一个链接</a>
<a href='#'>第二个链接</a>
<script>
window.onload=function(){
var l=document.links.length
for(var i=0;i<l;i++){
document.links[i].onclick=(function(x){
return function(){
alert(x+1);
}
})(i);
}
}
</script>
方法二:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content