为什么在返回的表达式有效之前使用javascript函数对象?

时间:2018-09-06 05:42:49

标签: javascript

为什么下面的javascript代码段有效。

  1. 即使在返回函数表达式之前,我也无法弄清楚为什么 require1 变量可以在正文中使用的原因。

  2. 在什么情况下,我们应该向函数对象添加属性,例如 require1.cache ,而不是仅通过 function(){} 声明函数>并在 require1 函数主体中使用它。

    const require1 = (name)=> {
        console.log(require1.cache);
    };
    require1.cache = {name:'test'};
    
    require1('test');
    

2 个答案:

答案 0 :(得分:2)

该函数不会立即进行求值-该函数首先将赋值赋给变量名require1,然后是后来的,一旦被调用,require1.cache将起作用,因为已将require1分配给它。如果在赋值之前立即调用了该函数,那将是正确的-会引发错误,因为此时尚未定义require1

功能添加属性是非常糟糕的做法,但是-最好使用外部变量,对象或构造函数(new)并分配给实例化。例如:

class require {
  constructor(cache) {
    this.cache = cache;
  }
  log() {
    console.log(this.cache);
  }
}
const require1 = new require({ name: 'test' });
require1.log();

答案 1 :(得分:0)

此片段:

(name) => {
    console.log(require1.cache);
};

arrow function的定义。这是一个匿名函数,也可以写成:

function (name) {
    console.log(require1.cache);
};

由于是匿名的,因此需要立即在表达式中使用它或将其存储在变量中(否则它将丢失并且您一无所获)。在您的示例中,它存储在require1变量中。

函数的代码在声明时不执行,而是在以后称为require1('test')时执行。

该函数使用未在函数内部声明的变量require1。这意味着它是来自封闭范围的变量(可能是全局变量)。将值分配给未声明的变量会在全局范围内创建一个变量。未声明的变量的值为[undefined]

了解有关JavaScript variables的更多信息。

执行该功能时(第require1('test');行),变量require1已经存在;它已在第一行初始化。此外,它的cache属性已经设置。