在不同范围内执行函数:Javascript

Posted

技术标签:

【中文标题】在不同范围内执行函数:Javascript【英文标题】:Execute function on different scope: Javascript 【发布时间】:2021-12-25 03:29:16 【问题描述】:

所以我认为这是不可能的,但我想知道...... 有没有办法创建一个像这样工作的函数?

const someFunction=()=> console.log(a); //printing some ref that is not out of this scope;

const wrappedFn = wrapFnOnScope(someFunction,a:"Hello World!");

wrappedFn() // prints Hello World!

【问题讨论】:

您似乎在描述this 关键字的工作方式。你为什么不想要它呢? 你以后可以做什么,但这不是基于范围。您只需通过调用传递对象,应用.. developer.mozilla.org/en-US/docs/Web/javascript/Reference/… @Keith - 如果我们认为 执行上下文this 的含义定义为属于词法上下文 - 它可以从字面上解释为范围事物。 @RandyCasburn 抱歉,不知道你在说什么。作用域就是作用域,与this无关。 const wrappedFn = console.log.bind(console, a:"hello"); 有点接近 【参考方案1】:

您似乎将变量属性混为一谈。变量是赋予代码中的值的临时名称。属性是存储在对象中的键值对。

如果你想创建一个简单地从对象中提取某个属性的函数,你可以这样做:

const bird =  wings: 2, color: "red" ;
const getColor = value => value.color;
const birdColor = getColor(bird); // "red"

其次,您试图提前将参数分配给函数,但只是为了稍后执行所述函数。这可以通过将函数调用包装在一个不带参数的函数中来完成,如下所示:

const a = 1;
const b = 2;
const c = 3;

const delayedApplication = () => console.log(a + b + c);
// nothing happened yet
delayedApplication();
// "6" has been logged to the console

【讨论】:

我明白其中的区别。例如,我知道 with 关键字会以某种方式与范围混淆。 with(a: "Hello world")console.log(a)(打印Hello world with 语句将对象的属性添加到当前作用域,就好像它们是变量一样,但这是一个非常糟糕的主意,可能会引起很多混乱。大多数 JS 程序员会告诉你不惜一切代价避免使用这个关键字,而不是将你对范围的理解建立在它之上。 除此之外,这是否回答了您的问题?如果不是,您可能需要进一步澄清。【参考方案2】:

这确实是不可能的。 JavaScript 具有词法范围,这意味着闭包中变量的范围(仅)取决于您定义函数的位置。之后无法更改。

如果你想要后期绑定,你需要在 JavaScript 中使用参数。可能是

const someFunction = (obj) => console.log(obj.a);
someFunction(a: 'Hello World');
// or
const wrappedFunction = () => someFunction(a: 'Hello World');
const wrappedFunction = someFunction.bind(undefined, a: 'Hello World');

或使用隐式第零参数this

function someFunction()  console.log(this.a); 
someFunction.call(a: 'Hello World');
// or
const wrappedFunction = () => someFunction.call(a: 'Hello World');
const wrappedFunction = someFunction.bind(a: 'Hello World');

如果您坚持在someFunction 中引用a 变量,请使用解构

const someFunction = (a) => console.log(a);
function someFunction()  const a = this; console.log(a); 

甚至是可怕的with 声明(坏主意!),但最终你必须在someFunction 中执行此操作。没有魔法wrapFnOnScope

【讨论】:

我猜是这样,但还是得问

以上是关于在不同范围内执行函数:Javascript的主要内容,如果未能解决你的问题,请参考以下文章

函数内声明函数的范围

javascript.

c++ 对象正在创建同一个数组的两个实例,但在不同的范围内?

如何用MATLAB把两个不同坐标范围的函数画在一个图上?

结构成员标识符放在啥范围内?

node.js 中存储的模块变量在啥范围内?