【问题标题】:How to define local variable to a function after creating it创建函数后如何将局部变量定义为函数
【发布时间】:2021-07-19 11:16:44
【问题描述】:
  • 我想知道是否有一种方法可以在声明函数后为函数定义局部变量,例如,如果我有以下函数
function x() { return t;}

我如何将t默认定义为局部变量来定义局部变量,你应该在它的函数中声明它

function x() {var t = 123; return t;}

但我的问题是有一种方法可以将t 定义为第一个函数的局部变量,然后执行类似

function x() { return t }
var y = x.define(var t = 123);
y();
  • 我希望有人帮助我在函数 x 的本地范围内做类似的事情

【问题讨论】:

  • 不可能...函数应该在创建时定义良好。
  • 那么就没有办法给函数x的局部作用域添加变量,甚至没有办法增加新作用域让他访问另一个函数的局部变量?
  • 这就是我的意思:没有办法将变量添加到函数x的局部范围内。您只能通过非局部变量更改来影响函数x。因此,在您的示例中,t 将是一个全局变量。但你的问题是关于本地的,所以答案是:不可能。
  • 谢谢........

标签: javascript function scope local-variables declare


【解决方案1】:

在 JavaScript 中,函数是一等公民。它可以作为参数传递或作为值返回。如您所说,要更改函数内部的值,您需要根据上述创建一个闭包。

function generate(t) {
  return function() {
    return t+2;
  };
}

const a = generate(1);
const b = generate(2);

a(); // return 3;
b(); // return 4;

【讨论】:

  • 如果你不想通过调用 generate() 来创建新函数,那么你可以使用 IIFE(立即调用函数表达式)。生成(1)(); //返回3;生成(2)(); //返回 4;
  • 这不是我需要的——我想定义新的闭包,它在创建函数时未定义到函数的本地范围,然后调用它以正常执行而不会出现未捕获的错误 t is not定义
【解决方案2】:

工厂函数?

// return a new function with t as a local variable.
const makeY = t => {
    // t is local, return new function with t.
    return () => t;
}
const y = makeY(123);
y(); //returns 123

或者对象表示法带有克隆功能,根据 JSX 评论中的反馈。

const defaultVars = {t:123};

function x(vars = defaultVars) {
   // private not accessible from global scope
   const privateVars = {...vars};
   this.set = function(varname, value) {
       privateVars[varname] = value;
   }
   this.clone = function() {
        // copy private variables
        return new x({...privateVars});
   }
   this.run = function() {
      return privateVars.t;
   }
}
const y = new x();
y.run() // 123
y.set('t', 1337);
y.run() // 1337
const z = y.clone(); // copy y
z.run() // 1337
z.set('t', 1349);
z.run() // 1349
y.run() // still 1337

【讨论】:

  • 也许是我放在你答案附近的例子,但我不想将它作为参数传递我想定义一个局部变量到函数 x 的局部范围,所以当检查全局对象 @987654323 @ 找不到它,在调用函数时它会找到它并执行代码,但这里的问题是我想在创建函数后定义局部变量
  • 我不确定,但听起来你想要做的是一个带有公共 setter/getter 的私有变量的类?例如克隆xy 以重用x 对象状态?或者你有更好的用例吗?还是您的问题更笼统,JS-scope 是如何工作的?
【解决方案3】:

这是最短的解决方案:

尽可能短

const x = t => t;

const y = () => x(123);

y(); //returns 123

更容易理解

function x(t) {
   return t;
}

function y() {
   return t(123);
}

y(); //returns 123

我唯一不明白的是,你为什么要那样做? 可以带参数调用t(),不需要声明y()函数,是多余的。

【讨论】:

  • 我不希望它作为参数,我希望它作为函数 x 的局部变量
  • 不可能。唯一的方法是使全局变量在x 中可见。你能解释整个问题吗?也许我们可以找到更好的解决方案:)
【解决方案4】:

如果您可以更改功能:

function x() { 
 return x.t
}

function y() {
 x.t = 123
 return x()
}

function z() {
 x.t = 'abc'
 return x()
}


console.log(y())
console.log(z())

y 中定义t 的方法。它与访问原始闭包并不完全相同,但取决于您的目的,它可以适合。请注意,现在 x 不需要是全局的,您可以传递任何函数(或动态创建),它仍然可以工作

function x() { 
  return t
}
function y(cb) {
   this.t = 123
   const toCall = cb.call(this)
   delete this.t
   return toCall
}
console.log(y(x))

console.log(y( () => `t is ${t}`))

【讨论】:

  • 我不需要任何全局变量,我想在创建函数后将变量添加到函数的局部范围,他们说这是不可能的
  • 这里没有使用全局变量,第一个t只是为了显示前后效果
  • t 在这里是全局变量,x.t 我不想将该变量用作属性,我希望它作为局部变量直接用它的名称调用他
  • 编辑让您看到不需要全局变量。
  • 我知道你正在努力帮助我,我很感激,但实际上这不是我想要的,而且这个编辑也没有提供任何帮助,因为这里的 x 是全局函数,脚本中的所有内容都可以访问它,您在这里所做的只是将属性设置为该全局函数,然后当您调用该属性然后调用该函数时,将添加更改,就像声明全局变量然后更改它的值我在这里的意思是您不要添加任何可以帮助回答我的问题的延期事项
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多