为什么下面的javascript代码段有效。
即使在返回函数表达式之前,我也无法弄清楚为什么 require1 变量可以在正文中使用的原因。
在什么情况下,我们应该向函数对象添加属性,例如 require1.cache ,而不是仅通过 function(){} 声明函数>并在 require1 函数主体中使用它。
const require1 = (name)=> {
console.log(require1.cache);
};
require1.cache = {name:'test'};
require1('test');
答案 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
属性已经设置。