如果在返回使用该变量的函数的函数的范围内创建了变量.有可能在外部访问那个变量吗


function creatPrintNumFunction()
{
var num= 12;
return function printNum()
{
console.log(num);
}
}
var printer = creatPrintNumFunction();
printer.num =13; //this part doesn't work but is there a way to access this Num variable Outside the creatPrintNumFunction, The printer function must be finding the num variable from somewhere.
printer();

那么,我如何在不更改createPrintNumFunction((的任何代码的情况下打印13而不是12最重要的是

关于我真正需要使用这个理论的更多上下文。我在node.js中使用了一个不想更改的外部模块express会话。有一个存储所有会话的"存储"变量,我需要访问它。唯一的问题是它是在函数中创建的。还有另一种方法我可以访问它,但它不是很方便

想要这样的东西吗?

function creatPrintNumFunction() {
const f = function printNum() {
console.log(f.num);
};
f.num = 12;           // set .num property to initial value
return f;             // return function "printNum"
}
var printer = creatPrintNumFunction();
printer.num = 13;
printer();
printer.num = 42;
printer();

有一个存储所有会话的"存储"变量,我需要访问它。唯一的问题是它是在函数中创建的。还有另一种方法我可以访问它,但它不是很方便

不,如果不修改代码,就无法访问store。并且您不应该修改外部模块的代码,因为store可能是由于某种原因而无法访问的。更改代码可能会导致代码库无法更新express-sessions

有这样的需要听起来像是一个XY问题。


如果这是您的代码,并且您希望允许访问变量,则有不同的方法。当然,您可以将var num移到creatPrintNumFunction之外(如Alneagorithm的答案中所述,但这打破了您以前的封装。这是否是一个好主意取决于实际用例。但您需要注意,如果这样做,从creatPrintNumFunction返回的每个"print"函数都会使用相同的变量。

假设您不想将CCD_ 7移出CCD_;打印";从creatPrintNumFunction返回的函数应该有自己的num变量。

然后,您可以在creatPrintNumFunction中创建另一个函数(例如set(,该函数可以更改num,并将此函数作为属性分配给从creatPrintNumFunction返回的函数。

function creatPrintNumFunction() {
var num = 12;

// both "set" and "printNum" create here
// have a closure over the same "num" variable
function set(val) {
num = val;
}
function printNum() {
console.log(num);
}
// the "set" function is assigned as a parameter to your
// printNum function
printNum.set = set;
return printNum;
}
var printerA = creatPrintNumFunction();
var printerB = creatPrintNumFunction();
printerA.set(13)
printerB.set(23)
printerA();
printerB();

这种方法的优点是不公开num,并且可以在set函数中控制如何/是否可以更改num

因此,您编写的关于printNum((函数能够以某种方式访问num变量的注释是由于JavaScript闭包。闭包是一个重要的JavaScript主题,我建议查看一些在线资源或这个stackoverflow post JavaScript闭包来了解它。本质上,当您从createPrintNumFunction返回printNum函数时,printNum功能将记住在createPrintNumFunction中声明的num变量。但是,要回答是否可以在声明变量的作用域之外访问变量的问题,答案是否定的。外部作用域不能从内部作用域访问变量。内部作用域可以从外部作用域访问变量。因此,除非您在声明num变量的范围之外跟踪它,否则您将无法访问num在声明范围之外保持的值。

因此,在这里,您可以在printNum函数内部更改num的值,如下所示:

function creatPrintNumFunction() {
var num = 12;
return function printNum() {
num = 13;
console.log(num);
};
}
var printer = creatPrintNumFunction();
printer.num = 13; //this part doesn't work but is there a way to access this Num variable Outside the creatPrintNumFunction, The printer function must be finding the num variable from somewhere.
printer();

您可以定义一个全局变量来跟踪num变量。然后,通过作用域链,num变量的printNum函数内部使用的值将解析为全局变量当前包含的值,如下所示:

var num = 12;
function creatPrintNumFunction() {
return function printNum() {
console.log(num);
};
}
var printer = creatPrintNumFunction();
num = 13; //this part doesn't work but is there a way to access this Num variable Outside the creatPrintNumFunction, The printer function must be finding the num variable from somewhere.
printer();

我相信还有其他方法可以解决这个问题,但我希望上面的方法之一能满足你的需求。

最新更新