gpt4 book ai didi

javascript - 这在私有(private)背景下

转载 作者:行者123 更新时间:2023-11-30 18:06:13 25 4
gpt4 key购买 nike

我想访问在私有(private)上下文中创建的变量。我正在创建这样的私有(private)上下文:

(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}

我正在使用空上下文调用函数。但是 this 不包含 a 变量。无论如何,console.log 怎么可能在空上下文中工作?

最佳答案

jsFiddle Demo

在创建对象的函数范围内 var a 存在。但是,一旦该范围丢失,变量也将丢失。如果您希望 a 持久化,则需要将其附加到使用 this 关键字创建的对象:

(new Function("this.a = 'hello'; console.log(this);")).call({});

但是,这是一种混淆的方式。这里有一些不需要的元素。主要是不需要 new 关键字(Function 表示函数对象)。 Function 还带有方法,例如 call

Function("this.a = 'hello'; console.log(this);").call({});

这也行得通。此外,如果您想保留变量 a 中的内容,您总是可以这样做(demo):

var obj = {};
Function("this.a = 'hello'").call(obj);
obj.a;//hello

至于为什么它适用于空上下文。您实际上已经使用 {} 为它提供了一个新构造的对象。这就是遇到引用 this 时在函数内部使用的作用域。事实上,如果您不打算使用作用域,call() 不需要参数。像这样:

Function("console.log(5);").call();

5 无错误地记录到控制台。


您的问题中使用的方法是从魔术字符串构建函数。我必须说,这种方法非常酷,与 eval 非常相似。但是我认为您正在寻找的东西归结为这种差异:

function ball(){
var color = "red";
return color;
}

function Ball(){
this.color = "red";
}

console.log(ball());//logs red
console.log(new Ball().color);//logs red

关于javascript - 这在私有(private)背景下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15753884/

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