Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何隔离/封装函数,以便只访问函数中的参数和变量_Javascript_P5.js - Fatal编程技术网

Javascript 如何隔离/封装函数,以便只访问函数中的参数和变量

Javascript 如何隔离/封装函数,以便只访问函数中的参数和变量,javascript,p5.js,Javascript,P5.js,我不知道如何隔离/封装一个函数,以便只访问函数中的参数和变量。例如,如果我有: let greeting = "hello there"; function sayStuff(){ console.log(greeting); } sayStuff(); 上面的代码会像预期的那样打印“hello there”,但我想这样做,以便sayStuff()中使用的任何内容都不能来自外部,除非作为参数解析进来。所以我想让sayStuff()抛出错误或打印为null,因为问候语没有定义 我查看

我不知道如何隔离/封装一个函数,以便只访问函数中的参数和变量。例如,如果我有:

let greeting = "hello there";

function sayStuff(){
    console.log(greeting);
}

sayStuff();
上面的代码会像预期的那样打印“hello there”,但我想这样做,以便sayStuff()中使用的任何内容都不能来自外部,除非作为参数解析进来。所以我想让sayStuff()抛出错误或打印为null,因为问候语没有定义

我查看了范围和许多链接,以及以前的帖子中提到的内容

(function() {
      //your code here
    })();
作为解决方案,但至少在我使用代码时,情况并非如此:

const untouchableNumber = 5;
(function() {
      //your code here
      console.log(untouchableNumber);
    })();
它仍然打印5,即使不可触摸的数字不在括号内,也不是参数之一


基本上说,我试图让函数成为自己的东西,并限制它可以访问的范围和不能访问的范围。

JS中的作用域不是这样工作的。JS总是可以访问范围更广的符号,除非您对它们进行局部阴影处理(例如,在函数中使用相同的命名变量)。根据您的描述,最接近的方法是使用JS模块,不设置任何全局变量(如果您试图编写健壮的代码,这通常是一个好主意)。那么这是否意味着我无法将函数限制在它可以访问或不能访问的内容上?实际上,真正的问题是“为什么?”因为如果您编写行为良好的代码,那么某些范围上下文中的代码可以访问更高范围上下文中的所有内容这一事实是完全正确的。正常编写你的函数,他们永远不应该超出(更不用说需要超出)自己的范围。@Mike'Pomax'Kamermans在我的特殊情况下,我想让人们为自己的ai编写代码(即你编写一些代码,程序通过eval()解析),但我不想让他们打乱规则。例如,我希望他们只能使用指定的函数并使用特定的变量执行逻辑,但我无法做到这一点,因为在不限制范围的情况下,人们可以更改游戏的任何规则永远不允许代码通过
eval()
(或
New function()
,或将JS代码作为字符串传递到
setInterval
setTimeout
)。我们有一个很好的理由使用CSP为这些东西添加阻塞。如果您需要运行用户代码,请在另一个域加载的iframe中运行它,这样您的用户代码就不能以任何方式访问您自己的页面代码、cookie、localStorage或其他任何不完全符合其代码运行所需的内容。JS中的作用域不是这样工作的。JS总是可以访问范围更广的符号,除非您对它们进行局部阴影处理(例如,在函数中使用相同的命名变量)。根据您的描述,最接近的方法是使用JS模块,不设置任何全局变量(如果您试图编写健壮的代码,这通常是一个好主意)。那么这是否意味着我无法将函数限制在它可以访问或不能访问的内容上?实际上,真正的问题是“为什么?”因为如果您编写行为良好的代码,那么某些范围上下文中的代码可以访问更高范围上下文中的所有内容这一事实是完全正确的。正常编写你的函数,他们永远不应该超出(更不用说需要超出)自己的范围。@Mike'Pomax'Kamermans在我的特殊情况下,我想让人们为自己的ai编写代码(即你编写一些代码,程序通过eval()解析),但我不想让他们打乱规则。例如,我希望他们只能使用指定的函数并使用特定的变量执行逻辑,但我无法做到这一点,因为在不限制范围的情况下,人们可以更改游戏的任何规则永远不允许代码通过
eval()
(或
New function()
,或将JS代码作为字符串传递到
setInterval
setTimeout
)。我们有一个很好的理由使用CSP为这些东西添加阻塞。如果需要运行用户代码,请在加载了不同域的iframe中运行它,这样用户的代码就不能以任何方式访问您自己的页面代码、cookies、localStorage或其他任何不完全符合其代码运行所需的内容。