一个函数能在另一个函数的变量作用域内执行吗?
在JavaScript中,是否可以把一个函数作为参数传给另一个函数,然后在接收函数的变量作用域内执行它?有点像Tool Command Language(TCL)中的uplevel吗?
在这个示例中,函数 m 能否使用函数 f 的 x 和 y?我知道 m 可以在 f 内部被调用为 m(x,y)(如果 m 是以这种方式声明的),但我想变更 m,使其在不同的调用中使用 f 的不同变量,以使 f 不需要“知道”如何调用它。
function f(m=null) {
let
x = 5,
y = 3,
z = 11
;
if (m) return m();
}
function g(m=null) {
let
x = 5,
y = 3,
z = 11
;
if (m) return m(x,y);
}
console.log(g( function (a,b) {return a * b;} )); // 15
console.log(f( function () {return x * y;} )); // error: x not defined
解决方案
不可以。 JavaScript使用静态作用域,而非动态作用域。 这意味着一个函数从它被定义的地方解析变量,而不是从它被调用的地方解析。
简而言之,函数不能自动在另一个函数的局部作用域内执行。
这是因为 g 明确传递了 x 和 y:
function g(m = null) {
let x = 5, y = 3, z = 11;
if (m) return m(x, y);
}
console.log(g(function (a, b) { return a * b; })); // 15
这不起作用,因为 x 和 y 并不在回调的静态作用域中:
function f(m = null) {
let x = 5, y = 3, z = 11;
if (m) return m();
}
console.log(f(function () { return x * y; }));
参见 JavaScript的词法作用域——JS中的作用域到底是什么?
如果你想纠正这个问题:
function f(m = null) {
let x = 5, y = 3, z = 11;
if (m) return m();
}
console.log(f(function () { return x * y; }));
改成:
function f(m = null) {
let x = 5, y = 3, z = 11;
if (m) return m({ x, y, z });
}
console.log(f(function ({ x, y }) { return x * y;})); // 15
console.log(f(function ({ x, z }) { return x + z;})); // 16
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
