Javascript 为什么函数不能访问外部声明的对象中的局部变量

Javascript 为什么函数不能访问外部声明的对象中的局部变量,javascript,Javascript,我正在为我的节点应用程序添加验证函数,并希望为该函数中提供的字段提供自定义消息。问题是,一些选项需要有一个默认值,而另一些我可以作为参数传递 let field = 'email'; let options = { 'message': `${field} is required` } function validation(field, opt = options) { console.log(opt.message); } validation('password'); val

我正在为我的节点应用程序添加验证函数,并希望为该函数中提供的字段提供自定义消息。问题是,一些选项需要有一个默认值,而另一些我可以作为参数传递

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是如何处理这段代码的。它如何访问所有内容以及如何获得所需的输出

谢谢

这将为options.message分配字段的当前值。因为你从不改变它的价值,所以你需要收到电子邮件。函数validationfield,opt=options中名为field的参数与同名的全局变量不同。并且它的值对options.message的值没有影响,因为该赋值在调用函数之前就已经执行了

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

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

      console.log(opt.message);
}
这将为options.message分配字段的当前值。因为你从不改变它的价值,所以你需要收到电子邮件。函数validationfield,opt=options中名为field的参数与同名的全局变量不同。并且它的值对options.message的值没有影响,因为该赋值在调用函数之前就已经执行了

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

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

      console.log(opt.message);
}

在您的代码中,您只需创建选项对象,并使用message field=email是必需的来创建它。你永远不会改变它的价值。或者,您可以在每次希望参数化对象时生成该对象:

const field = 'email';

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

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

在您的代码中,您只需创建选项对象,并使用message field=email是必需的来创建它。你永远不会改变它的价值。或者,您可以在每次希望参数化对象时生成该对象:

const field = 'email';

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

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

 message: field + " is required"
它直接查找字段并生成:

 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'})
同:

 message: field + " is required"
它直接查找字段并生成:

 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'})

你试过调试你的代码吗?因为从您提供的代码片段中,我强烈认为您没有更具体地描述我在上面的愤怒评论,我这样问是因为您在函数声明中赋值,因此大多数linter都会对此发出警告@作为默认参数的rawrplus。在教别人之前先自己学习JS。你试过调试代码吗?因为从您提供的代码片段中,我强烈认为您没有更具体地描述我在上面的愤怒评论,我这样问是因为您在函数声明中赋值,因此大多数linter都会对此发出警告@作为默认参数的rawrplus。在你教别人之前先学会自己。