js错题集

  • 下面这个JS程序的输出是什么:
function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}
 
var f1 = Foo(),
    f2 = Foo();
f1();
f1();
f2();

答案:010
/*(1)Function是引用类型:保存在堆中,变量f1,f2是保存在栈中;
(2)闭包:一个函数(产生新的作用域)定义的局部变量、子函数的作用域在函数内,但是一旦离开了这个函数,局部变量就无法访问,所有通过返回子函数到一个变量f1的方法,让f1指向堆中的函数作用域,这样可以使用局部变量i.
(3)过程:
   第一次f1()  :f1=Foo()中,先执行Foo(): i = 0,return值返回给f1(f1指向子函数   f1()=function(){.....},因为子函数没有 定义i,所以向上找到父函数定义的 i:  )并执行子函数 输出i=0,再自加 i =1(覆盖了父函数Foo 的 i值);
  第二次f1() : 执行的是子函数 Function(){  ..},输出的是父函数 的 i=1,再自加 i =2;
  第一次f2():同第一次f1(),不同的是 f2指向堆中一个新的对象 function(){ ...},所有此i非彼i,输出i=0;如果再次f2(),那么和第二次f1(),一样输出i=1; */
  //前两次子函数的i值指向的是同一个function对象,第三次指向的是一个新的function对象
  //使用闭包把函数的局部变量驻留起来,函数执行完了也不会被销毁
  //即使函数foo执行完毕,在子函数的执行环境往上找依然可以找到函数foo这个执行环境已经环境中的变量i。执行f1,开辟了一个内存,执行f2又开辟了一个内存,两个函数的i值分别存在与两个不同的作用域中。
  • 请给出这段代码的运行结果
<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
    bb = 2;
    alert(bb);
};
aa(bb);
alert(bb);
</SCRIPT>
答案:2  1
//
函数体内,bb并没有使用var来定义,按理说这个bb在预处理的时候应该是window的属性。但在这里,函数声明的时候,带了一个参数bb,也就是相当于在函数体内声明了var bb。所以,函数里的bb就是函数活动对象的属性。所以函数执行时会输出2。函数执行完后,函数的活动对象被销毁,也就是局部的这个bb被删除了,执行流进入到window,再输出bb,值就是1了。如果声明函数时,把参数那里的bb去掉,这段代码执行起来,结果就是弹出 2 2
  • border:none以及border:0的区别
1.效果
border-style:none;//无边框         
border-width:0;//边框宽度为0px  
2.区别
(1)性能差异
border:0;浏览器对border-width、border-color进行渲染,占用内存。
border:none;浏览器不进行渲染,不占用内存。
  • 浏览器内核介绍
浏览器 的内核引擎,基本上是四分天下:
1)Trident: IE 以Trident 作为内核引擎;
2)Gecko: Firefox 是基于 Gecko 开发;
3)WebKit: Safari, Google Chrome,傲游3,猎豹浏览器,百度浏览器 opera浏览器;
4)Presto: Opera的内核,但由于市场选择问题,主要应用在手机平台--Opera mini
  • 以 下语句的执行结果是什么?
    这里写图片描述
答案: ‘one’’three’’two’

   one第一个执行就不用说了,而后面的函数用了settimeout,这个函数是指定毫秒数后调用函数或者是计算表达式的,而settimeout设置为0s,你以为他会马上执行?其实他被js放在队列中了,要等别人执行完了,他才会执行。
   回调时,被回调的函数会被放在event loop里,等待线程里的任务执行完后才执行event loop里的代码。
  • 以下 javascript 代码,在浏览器中运行的结果是
    这里写图片描述
答案: 首先全部输出first,然后全部输出second

  js 是运行于单线程环境中,定时器作用是在规定时间内将事件加入执行队列,而加入的前提是当前事件队列没有任何东西,否则会优先执行队列里的任务
  所以是过了5毫秒把定时器里的函数添加到事件队列中,而不是过了5毫秒就立即执行它。因为打印first事件队列是先于定时器的函数的,因此即使5毫秒后,还是会先把first打印完再往后执行。
  • 请问 a 的结果是什么?
if(! "a" in window){
    var a = 1;
}
alert(a);
答案:undefined
//javascript只有函数作用域, 没有块作用域,所以在if 里面的赋值语句 
var a = 1;
分两步
var a ; //这个声明语句会被提升到代码顶部。 

if(! 'a' in window)
//因为! 比 in 的优先级高,所以这个判断式等价 (!'a') in window, 结果为false,
//所以不会执行赋值语句
//alert(a) 返回 undefined
  • display:none与visibility:hidden区别:
 display:none与visibility:hidden都可以用来隐藏某个元素。
 display:none在隐藏元素的时候,将其占位空间也去掉;而visibility:hidden只是隐藏了内容而已,其占位空间仍然保留。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值