我的createRandomList函数中的randomNumber变量是作用域还是块作用域?我的for循环块的i变量声明是作用域还是函数作用域?在所有类型的循环中,如果我使用let键在for循环的圆括号部分声明一个变量(for(let i = 0; i < something.length; i += 1) { // something goes in here }),那么该变量是块范围的,对吗?最后一个问题,在for循环中,整个语句就是循环,对吧?循环不仅仅是代码块,对吧?我之所以这样问,是因为有些人将整个过程称为循环,而另一些人则将代码块称为循环。
function rando
我已经学习javascript语法大约一个星期了。
如何将变量从一个本地作用域移动到另一个本地作用域?例如,我在屏幕上创建了一个for循环,它在循环的每一轮都向一个主数组添加一个值数组,主数组称为x。我没有包含这个循环,因为它与问题无关。在下面的示例中,变量y离开屏幕的目的本质上是获取x数组中包含的值,以便通过web擦拭来检索更多数据。
除了上下文之外,我无法访问if语句中声明的y变量。正如您在下面看到的,我试图在一个名为functionName的函数中使用它作为参数。
if (x.length === 1){
let y = x[0]
} else {
let y = x[
我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
(C++):
if (true) {
int x = 1;
}
std::cout << x << std::endl;
此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
(VBA):
If True Then
Dim x As
下面的代码编译失败,声明“名为'st‘的局部变量不能在这个作用域中声明,因为它会赋予'st’不同的含义,‘st’已经在'child‘作用域中用来表示其他东西”:
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
我理解为什么这样做行不通:
string preParent = "";
{
我在Python中使用了以下函数,该函数似乎正在运行:
def test(self):
x = -1
# why don't I need to initialize y = 0 here?
if (x < 0):
y = 23
return y
但是为了让它工作,为什么我不需要初始化变量y呢?我以为Python有块作用域,这怎么可能呢?
由于我现在已经开始学习js,所以我对javascipt很陌生,我对var非常困惑,据说它是函数作用域和块作用域;
如果是,那么我们如何在该功能之外访问它们!?假设我想从另一个类中使用它(我不知道可能通过创建某个对象或其他什么方法)(我想我们不能在这里创建对象!)因为它是一种基于函数式编程的语言,所以我猜!:()
var y = "global";
if (y === "global") {
var y = "block-scoped";
console.log(y); // expected output: block-scoped
}
对于以下类型的C代码,有专门的术语吗?在我的示例中,我希望增加函数中一小块代码的作用域深度,而不必使用不必要的if/else/for语句,以便可以多次重新声明具有相同名称的变量。例如:
void myfunc(void) {
int a = 0, b = 1;
{
int c;
c = 3;
printf("c is: %d", c);
}
a = 2;
{
int c = 5;
printf("c is %d", c);
}
}
用什么术语来描述我如何用大括号包装一些代码,并增加范围深度,使函
在C中,您可以使用语句块将局部变量与其父作用域隔离。
int foo() {
{
int a;
}
// Here `a` is no longer in the scope.
}
但在Ruby中,以下代码无法解析。
def foo
do
a = 1
end
puts a
end
在Ruby中有没有将变量隔离到某个作用域中的技巧?
我知道在c++中变量有块作用域,例如,下面的代码在C++中工作
void foo(){
int a = 0;
for(int i = 0; i < 10; ++i){
int a = 1; //re-define a here.
}
}
但是这个代码片段在java中不起作用,它报告“重复的局部变量a",这是否意味着java变量没有块作用域?
我对为什么这段代码不起作用感到有点困惑:
def create(type)
Module.new do
def foo
type
end
end
end
在对返回的模块调用foo时,未定义type。我应该使用Proc或lambda来捕获create方法中的作用域吗?
(我最近可能做了太多JavaScript了)
tl;dr
如何使用在创建时使用可用变量的方法在运行时创建模块?
我看到在作用域内定义变量是可能的,但是在该作用域之外引用它。例如,下面的代码可以工作:
if condition:
x = 5
else:
x = 10
print x
然而,这让我觉得有点奇怪。如果您尝试在C中执行此操作,变量X的作用域将不正确:
if(condition) { int x = 5; }
else { int x = 10; }
print x; // Doesn't work: x is unavailable!
无论如何,在C中的解决方案是首先声明X,然后弄清楚如何处理它:
int x;
if(condition) { x = 5; }
else
IIFE主要用于封装作用域
(function () {
let myVar = 10; // not global
// ...
}());
但是为什么不直接使用块语句呢?
{
let myVar = 10; // also not global
// ...
}
除了作用域封装之外,使用IIFE还有其他好处吗?
Python在关闭作用域后不会删除变量(如果Python中存在作用域,我不确定)。我的意思是,一旦我完成了一个for variable in range(1, 100),variable仍然存在,并且有一个值(在本例中是99)。
现在,当我使用with ... as语句时,通常会缩进整个块。但是,我是否应该在完成该文件后立即关闭该文件并结束缩进?我是说,我应该写:
with open('somefile', 'r') as f:
newvar = f.read()
newvar.replace('a', 'b') # a