JavaScript中超级经典的面试题

1.此题考擦变量提升

    this.a = 30;
    var obj =  {

        a: 40,
        test : function () {
//            console.log('111111111111');
//            console.log(this);

            console.log(a);
            console.log(this.a); //40


            function fn() {
                this.a = 60;
//                console.log('2222222'); 这两行是调试方便调式的 想用可以打开
                console.log(this);
                console.log(this.a);
            }
            fn.prototype.a = 70;
            return fn;
        }
    };


    var p = obj.test();
    p();
    new (obj.test())();
    //上面一句等价于下面两句代码
//    var s = new (test.init());  //s是属于window对象 A
//    s(); //谁调用go方法 this就指向谁 此时指向window  B

   

   

依次输出结果:30 40 60  接着执行new (test.init())(); 输出60 40 60

    详解:1. 30 40 60  先输出30 这个a是window的a 此时this指向test对象,所以接着输出40 此时p指向go函数 p属于window下的变量,
    go函数里面this指向window,此时在打印会输出60
              2.  60 40 60  接着执行分解后的A输出60 40 因为第一个a是window下面的a 60 第二a是test对象下的a 40,接着执行上面标注的代码B
    创建一个go对象, 此时this指向go对象 但是构造函数的属性优先级高于原型链中的优先级 所以输出60


2.对上面的代码稍微在变化一下 仔细在看一下

    this.a = 30;
    var obj =  {

        a: 40,
        test : function () {
//            console.log('111111111111');
            console.log(this); //此时this指向obj对象

            console.log(a);
            console.log(this.a); //40


            function fn() {
                this.a = 60;
//                console.log('2222222'); 这两行是调试方便调式的 想用可以打开
                console.log(this);  //指向window
                console.log(this.a);
            }
            fn.prototype.a = 70;
//            return fn;
            fn(); //就这个一句代码跟上面不一样
        }
    };



    obj.test();
//    obj.test(); //在执行一次 依次输出60 40 60

总结:    一句代码之差输出结果就不一样 一次输出30 40 60  此时不关test什么事


3.考擦按址传递还是按值传递

按址传递和按值传递区别在于你copy的是地址还是值,一般情况下基本数据类型字符串 数值型 bool是属于值引用,只是对值的拷贝,数组和对象属于址引用,是对地址的拷贝,还是上代码,简单明了

//值引用
var a = 'hello';
var b = a;
b = 'world'; //此时对b进行修改并不会影响a的值 以为这是指引用,只是拷贝的值 非地址 所以并不影响a值的变化
console.log(a);
console.log(b);

//址引用
var arr1 = [1,2,3,1,43,12,12,1];
var arr2 = arr1;
arr2.push(100);  //此时修改arr2的值 会同时改变arr1的值 因为他们是指向的同一块地址
console.log(arr2);
console.log(arr1);


4. 考擦异步操作和同步操作

$(document).click(function () {
    console.log(1);
})

setTimeout(function () {
    console.log(2);
},0)


while(true){
    console.log(3);
}

输出结果:什么都不输出,页面直接卡死, 原因:setTimeout  setInterval   ajx 事件操作eg:click  属于异步操作  while  for循环同步 等到同步操作结束后,才会去执行异步操作,所以会直接卡死




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值