在 javascript 中关闭词法范围

switch off lexical scoping in javascript

是否可以更改 javascript 的词法范围,以便函数使用在调用时而不是在定义时有效的变量范围?简而言之,我可以更改与函数关联的作用域链吗?

举个例子: 我希望能够执行类似这样的操作而不会收到错误消息,即 y 未定义:

function f(){y+2};
function g(){
 var y=2;
 f();
 return y;
}
g();

您的问题可能是对您的问题有误解。 y 未在 f() 的功能范围内定义,您永远不会为其赋值。 g() 中的 y 作用域为该函数。

在你的例子中:

function f(){ y+2 };
function g(){
  var y=2;
  f();
  return y;
}
g();

如果g()使用全局y,那么f()中的y将在运行时定义。在 g() 中删除 var 关键字以在编译时创建全局 y

function f(){ y+2 };
function g(){
  y=2;
  f();
  return y;
}
g();

注意: 可以像这样创建全局范围的变量,但 推荐。由于您的示例是人为设计的,仅用于理解范围,因此不会造成任何伤害。