gpt4 book ai didi

javascript - 是否可以在 JavaScript 中实现动态作用域而无需求助于 eval?

转载 作者:行者123 更新时间:2023-12-03 00:58:44 24 4
gpt4 key购买 nike

JavaScript 具有词法作用域,这意味着从函数内访问的非局部变量将解析为定义该函数时该函数的父级作用域中存在的变量。这与动态作用域相反,在动态作用域中,从函数内部访问的非局部变量被解析为调用该函数时存在于该函数的调用作用域中的变量。

x=1
function g () { echo $x ; x=2 ; }
function f () { local x=3 ; g ; }
f # does this print 1, or 3?
echo $x # does this print 1, or 2?

上面的程序在词法作用域语言中打印 1,然后打印 2,在动态作用域语言中打印 3,然后打印 1。由于 JavaScript 具有词法作用域,因此它将打印 1,然后打印 2,如下所示:

var print = x => console.log(x);

var x = 1;

function g() {
print(x);
x = 2;
}

function f() {
var x = 3;
g();
}

f(); // prints 1

print(x); // prints 2

虽然 JavaScript 不支持动态作用域,但我们可以使用 eval 实现它,如下所示:

var print = x => console.log(x);

var x = 1;

function g() {
print(x);
x = 2;
}

function f() {
// create a new local copy of `g` bound to the current scope
// explicitly assign it to a variable since functions can be unnamed
// place this code in the beginning of the function - manual hoisting
var g_ = eval("(" + String(g) + ")");
var x = 3;
g_();
}

f(); // prints 3

print(x); // prints 1

我想知道是否存在另一种可能的方法来实现相同的结果而不诉诸eval

编辑:这是我尝试在不使用eval的情况下实现的:

var print = x => console.log(x);

function Class(clazz) {
return function () {
var constructor;
var Constructor = eval("(" + String(clazz) + ")");
Constructor.apply(this, arguments);
constructor.apply(this, arguments);
};
}

var Rectangle = new Class(function () {
var width, height;

constructor = function (w, h) {
width = w;
height = h;
};

this.area = function () {
return width * height;
};
});

var rectangle = new Rectangle(2, 3);
print(rectangle.area());

我知道这不是一个很好的例子,但总体思路是使用动态作用域来创建闭包。我认为这种模式有很大的潜力。

最佳答案

要添加有关此主题的注释:

在 JavaScript 中使用时:

  • 函数声明语句或函数定义表达式,则局部变量将具有词法作用域。

  • 函数构造函数,然后局部变量将引用全局范围(顶级代码)

  • this 是 JavaScript 中唯一具有动态的内置对象范围并通过执行(或调用)上下文设置。

因此,为了回答您的问题,在 JS 中,this 已经是该语言的动态作用域功能,您甚至不需要模拟另一个功能。

关于javascript - 是否可以在 JavaScript 中实现动态作用域而无需求助于 eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com