js笔试题大全--附详解

考查this指向

1、

    let length=100
    function f1(){
        console.log(this.length)
    }
    let obj={
        length:10,
        f2:function(f1){
            f1()
            arguments[0]()
        }
    }
    obj.f2(f1,1);  //100  2

    //分析arguments[0]形式
      function f1() {
        console.log(this)
      }
      let arr = [f1, 1, 2, 3]
       arr[0]()      //注意这里,数组调用函数就类似于对象调用函数  像:obj['f1'](),所以this指向该数组

分析:this指向分为以下几种情况
1、默认绑定 无调用者会指向window, 严格模式下指向undefined,node环境指向global;
2、隐式绑定 指向调用者;
3、显示绑定call apply bind(改变this指向);
4、new方式

解析:显然f2函数是被obj对象调用的,所以f2中的this是指向obj的,f1函数作为参数传递到f2函数中被调用,前面并没有调用者,所以f1函数中的this指向window,所以会输出100;arguments是指传入的形参,承接代码中的分析,this应该指向的是arguments数组对象,故this.length就等于arguments.length,所以输出了2;

全局变量和局部变量同名时的坑

1、

var a=10
function test(){
    console.log(a)
    a=100;
    console.log(this.a)
    var a;
    console.log(a)
}
test()  //undefined 10 100

//这里可以进一步改造一下
var a=10
function test(){
    console.log(a)
    a=100;
    console.log(this.a)  //注意!!!这里this依然是指向window,但是因为a=100改变的是全局变量,
                         //this.a指向的也是全局变量a,所以会跟着全局变量发生改变,输出100;
    //var a;    去掉这行代码    此时没有了变量提升,函数中的变量a都是使用的全局变量a
    console.log(a)
}
test()  //10 100 100

涉及知识点:
变量提升和预解析;
作用域;

解析:
函数中有用var声明的变量,所以变量a会被提升到函数作用域中的顶部,由于此时a只是声明并未进行复制操作所以第一行会打印undefined;
a=100此时的a变成了一个局部变量,所以this.a指向的是window下全局变量a,因此打印10;
因为前面局部变量a已经进行了赋值,所以最后打印出100

2、

var a=10;
function f1(){
    var b=2*a
    var a=20
    var c=a+1
    console.log(b)
    console.log(c)
}
f1()    //NaN 21
//执行过程相当于:
var b;
var a;
var c;
b=2*a;
a=20;
c=a+1;
console.log(b);
console.log(c);
//结果是不是一目了然了呢

这里注意一下2*undefined等于NaN

未完待续...

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

相关阅读更多精彩内容

友情链接更多精彩内容