具有此保留字的Javascript箭头功能

时间:2019-03-09 20:52:27

标签: javascript function expression this arrow-functions

我试图创建一个函数,然后将其附加到现有对象上。 这些是我的对象:

const cake1 = new Obj('cake1','cake','vanilla');
const cake2 = new Obj('cake2','cake','chocolate');
const cake3 = new Obj('cake3','cake','vanilla');

现在他们没有任何方法。

这些是我的功能和数据:

const flavors = ['vanilla','chocolate'];
const isChocolate = (cake , flavors) => {
  console.log(cake);
    if(typeof cake === 'object' && typeof cake.type !== 'undefined' && cake.type === 'cake'){
      if(typeof cake.meta !== 'undefined'){
         if(cake.meta === flavors[1]){//Chocolate
           return true;
         }
      }
    }
    return false;//Any other case
}

const checkTheCake =(flavors,isChocolate) => {
  if(isChocolate( this , flavors)) {  // this refer to window
    console.log('is chocolate');
  }else{
    console.log('is vanilla');
  }
}

最后,我添加了checkTheCake函数作为方法。

cake1.checkTheCake = checkTheCake;
cake2.checkTheCake = checkTheCake;
cake3.checkTheCake = checkTheCake;

cake1.checkTheCake(flavors, isChocolate);
cake2.checkTheCake(flavors, isChocolate);
cake3.checkTheCake(flavors, isChocolate);

首先,当我运行this中的代码checkTheCake时,它引用了窗口对象。 当我将checkTheCake从表达式更改为语句时,我设法解决了这个问题,它指向了我的Cake对象。

function checkTheCake (flavors,isChocolate){
  if(isChocolate( this , flavors)){ //this refers to cake
    console.log('is chocolate');
  }else{
    console.log('is vanilla');
  }
}

我的问题是,在这种特殊情况下,为什么javascript的行为如此?

编辑后:起初,我认为问题出在函数语句和函数表达式上,但实际上与Arrow函数有关。

0 个答案:

没有答案