美文网首页
2020-07-17面试题

2020-07-17面试题

作者: rainy66 | 来源:发表于2020-07-19 18:21 被阅读0次

    第一题:写出打印结果,并分析原因

    var length = 10;
        function fn() {
            console.log(this.length);
        }
        var obj = {
            length:5,
            method:function(fn) {
                fn();
                arguments[0]();
            }
        };
        obj.method(fn,1);
    

    输出的结果为:


    微信图片_20200719171003.png

    解析:首先,我们在全局定义了一个变量length、一个对象obj和一个函数fn,length赋值为10。接下来是fn函数,输出this.length。对象obj中,obj.length是5,obj.method是一个函数。method函数里面形参也是一个函数,这个函数里面调用了fn函数,arguments是一个伪数组,代表method函数实际接收到参数列表,所以arguments0就代表了调用arguments里的第一项。obj.method(fn,1)代表的就是调用obj当中的method函数,而且传递了两个参数,fn和1。
    分析完代码的含义,我们来看输出结果。method函数当中调用的fn函数是全局当中的函数,所以this指向的是window,this.length就是10。上面说了,arguments0代表的是调用arguments里面的第一项,也就是传参进来的fn,所以这个this指向的是arguments,method函数接收的参数是两个,所以arguments.length就是2,最后输出结果就是10 2。

    第二题:写出打印结果,并分析出原因

    function a(xx) {
      this.x = xx;
      return this
    };
    var x = a(5);
    var y = a(6);
    console.log(x.x);
    console.log(y.x);
    

    [图片上传中...(微信图片_20200719175110.png-eaae72-1595152288788-0)]
    解析:首先,我们在全局定义了一个变量x,一个变量y和一个函数a,函数a当中的this.x等于接收到的参数,返回this,这里要注意,返回的不是this.x,而是this.接下来我们给x赋值,值为a(5),又给y进行赋值,值为a(6),最后,我们输出x.x,y.x。
    分析完代码的含义,我们来看输出结果。a函数传了一个参数5,那么this.x就被赋值为了5,函数a的this指向的是window,也就是window.x = 5。上面我们说过,这个函数返回的是this,也就是this指向的是window,x = a(5)就相当于window.x = window,此时的x被赋值为了window。下面又执行了y = a(6),也就是说,x的值发生了改变,变成了6,y则被赋值为了window。cnsole.log(x.x)就相当于console.log(6.x),输出的自然是undefine。console.log(y.x),输出的相当于是console.log(window.x),得到的自然是6。最后输出的结果为undefine 6

    相关文章

      网友评论

          本文标题:2020-07-17面试题

          本文链接:https://www.haomeiwen.com/subject/rohrkktx.html