为什么函数无法访问外部声明的对象中的局部变量

时间:2018-08-05 17:22:10

标签: javascript

我正在为我的Node应用程序添加验证功能,并希望为我在该功能中提供的字段提供自定义消息。问题是,某些选项需要具有默认值,而其他选项则可以作为参数传递。

let field = 'email';

let options = {
  'message': `${field} is required`
}

function validation(field, opt = options) {
  console.log(opt.message);
}

validation('password');
validation('confirm', {message: 'Confirm password is required'})

但是在这种情况下,输出是

"email is required"
"Confirm password is required"

我希望输出为

"password is required"
"Confirm password is required"

我也想知道Javascript是如何工作的。它如何访问所有内容以及如何获取所需的输出。

谢谢

3 个答案:

答案 0 :(得分:3)

let field = 'email';

let options = {
  'message': `${field} is required`
}

这为options.message分配了field的当前值。由于您从不更改其值,因此得到"email is required"field中名为function validation(field, opt = options)的参数是与具有相同名称的全局变量不同的变量。而且其值对options.message的值没有影响,因为该赋值在调用该函数之前已经执行。

操纵全局对象被认为是不良的编程。相反,您可以在函数内部创建对象:

function validation(field) {
    let opt = {
      'message': `${field} is required`
    }

      console.log(opt.message);
}

答案 1 :(得分:3)

在您的代码中,您只需创建option对象,并使用message field =“ email is required”创建它。而且您永远都不会改变它的价值。或者,您可以在每次参数化时生成对象:

const field = 'email';

const getOptions = (field) => ({
  'message': `${field} is required`
});

function validation(field, opt) {
  opt = opt || getOptions(field);
  console.log(opt.message);
}

答案 2 :(得分:1)

   message:`${field} is required`

与:

 message: field + " is required"

直接查找field并显示:

 message: "email is required"

要稍后进行评估,您必须使用传递字段名称的函数,然后在其中返回消息:

 const options = {
   message: field => `${field} is required`,
 }

 function validation(field, opt = options) {
   const msg = typeof opt.message === "function" ? opt.message(field) : opt.message;
   console.log(msg);
 }

 validation('password');
 validation('confirm', {message: 'Confirm password is required'})