【JS】--易错题、面试题归档

普通函数和箭头函数的区别

  • 箭头函数不能作构造函数。
  • 箭头函数没有argument参数。如果你想访问箭头函数的直接参数,可以使用剩余参数 ...args,剩余参数 ... args 接受箭头函数的执行参数
  • 箭头函数没有自己的This.指向,箭头函数内部的 this 值始终等于外部函数的 this值。换句话说,箭头函数可按词法解析 this,箭头函数没有定义自己的执行上下文。
  • 常规函数如果缺少 return 语句,或者 return 语句后面没有表达式,则常规函数隐式返回undefined
    如果箭头函数包含一个表达式,而你省略了该函数的花括号,则将显式返回该表达式。这些是内联箭头函数

This指向问题

  • this是声明函数时附加的参数,指向特定的对象,也就是隐藏参数。

  • this提供了一种更加优雅的方式来隐式的传递对象引用。

  • this永远指向调用他的对象

    一个测试题

var length = 10;
function fn() {
    console.log(this.length);
}
 
var obj = {
  length: 5,
  method: function(fn) {
    fn();
    arguments[0]();
  }
};
 
obj.method(fn, 1);//输出是什么?

只要认准 this永远指向调用他的对象,这道题就很简单了
在执行 obj.method()时,如果函数内部执行console.log(this.length),函数的调用对象为obj,this指向obj,但是method()内部执行的是fn()函数,而fn()函数的调用对象为window,即window.fn(),即this指向window,输出为 10;
参数fn1属于arguments类数组对象,arguments[0]()就是调用了fn(),此时fn的作用域为arguments,即this指向argumentsthis.length即传入的参数的长度2
结果输出为 10,2

闭包和自执行参数

var test = function(a){
    this.a = a;
    return function(b){
        return this.a + b;
    }
}(function(a,b){
    return a;
}(1,2))
test(4)

解析

var test = function(a){
    this.a = a;  // this指向window
    return function(b){
        return this.a + b;
    }
}
var getA = function(a,b){
    return a;
}(1,2)   //自执行函数 返回1,b没有用到
即:  
test(getA)(4)  // test(1)(4)
test(1) 返回函数
function(b){
    return this.a+b
}
此时 a 为 1 

很明显 最后返回 1+4 结果为 5
原文地址:https://www.cnblogs.com/asenper/p/13046913.html