javascript - 是否可以在 Javascript 中以编程方式更改词法范围?

标签 javascript scope

我不知道这是否可行,但是假设我们有以下代码:

var name = 'John';

function log() {
    console.log('Hello ' + name );
}

function greetTravis() {
    var name = 'Travis';

    log(); // This function is defined outside greetTravis's scope. 
}


greetTravis();
log();

结果:

Hello John // Is there a workaround to get "Hello Travis"?
Hello John

硬编码解决方案:(我不想重复自己)

var name = 'John';

function log() {
    console.log('Hello ' + name );
}

function greetTravis() {
    var name = 'Travis';

    log(); // Now, it is defined inside greetTravis's scope. 

    function log() {
        console.log('Hello ' + name );
    }

}


greetTravis();
log();

我追求的是:

我想在不传递变量的情况下从日志函数访问名称变量(greetTravis() 中的那个),也许使用改变 log() 范围的函数,例如:调用/绑定(bind)。

Note: call and bind functions allow you to change the context (this) not the scope .

最佳答案

对于您想要的结果,您只需重构 log 以便它采用您希望它记录的名称。

仅供引用 - window 对象有一个名为 name 的属性。因此,最好不要在代码中将 name 用作 Global。

var userName = 'John';

function log(val) {
    console.log('Hello ' + val );
}

function greetTravis() {
    var userName = 'Travis';

    log(userName); // This function is defined outside greetTravis's scope. 
}


greetTravis();
log(userName);

关于javascript - 是否可以在 Javascript 中以编程方式更改词法范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51953812/

相关文章:

javascript - 获取保留任何文本装饰样式的文本

javascript - 使用 JavaScript 通过单击在单个窗口上打开多个选项卡

javascript - 如何使用nodejs使用promise?

c++ - 什么是通过引用查找调用范围的标准引用?

javascript - 有什么方法可以使用 .bind 或 .apply 为被调用方法提供调用方法或循环的范围?

java - 为什么线程对象在作用域后没有被销毁?

javascript - 从 URL 获取参数并在字典中使用它

JavaScript "catch"内存不足错误

vba - VBA 变量何时实例化

C++ 错误 : Was not declared in the scope