变量'str2'如何在传递给display方法的回调方法中可用? str2应仅在函数'name'中可见。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
答案 0 :(得分:0)
Javascript中的变量作用域是分层的。较低的范围可以访问所有较高范围的所有变量。这是一个例子:
function outer() {
var foo = 2;
function inner() {
console.log(foo); // 2
}
}
如果将变量作为参数传递或者将其定义为局部变量
,则无关紧要答案 1 :(得分:0)
在Javascript中,在某个范围内声明的变量在每个内部范围内都可用。在这种情况下,它是一个称为“闭包”的概念。这个答案可能会让您对Javascript中的作用域有很好的了解:What is the scope of variables in JavaScript?
希望这个简单的例子可以帮助你理解它的用处:
function counter () {
var votes = 0;
this.upvote = function() { votes++; }
this.downvote = function() { votes--; }
this.getValue = function() { return votes; }
}
var counter1 = new counter();
counter1.upvote();
console.log(counter1.getValue()) // Prints 1
counter1.upvote();
counter1.upvote();
console.log(counter1.getValue()) // Prints 3
答案 2 :(得分:0)
是的public class Test {
public static void main(String[] args) {
double[][] arr = new double[5][5];
ClassName num1 = new ClassName(arr);
num1.myMethod();//do something
}
只能在功能名称'名称' 是的,它与您说的相同,在JavaScript 函数声明中,在执行任何代码之前加载,范围取决于执行上下文
str
的代码范围中的位于name()函数内,您在此范围内调用str2
(在name()范围内),这是a.display()
可用的原因执行时在str2
内。
答案 3 :(得分:0)
要评估name(a, 'ddd')
,编译器将创建一个新的堆栈帧并在其上放置两个插槽,一个a
,它将是对同名全局对象的引用,并{{ 1}},它将包含字符串文字str2
。然后评估身体。
在正文中,要评估'ddd'
,a.display(function(){...})
的值将被解析为带参数a.display
的函数。为了评估n
,将创建一个新的堆栈帧,其中n(function(){...})
分配给闭包,这是通过评估匿名回调得到的(闭包是指向函数静态范围的指针和编译器为函数本身生成的代码)。然后将评估n
函数的主体。
在正文中,将使用给定的字符串调用a.display
。然后将评估回调console.log
。由于n()
不接受任何参数,因此只会在最顶层的堆栈帧中进行评估,因此在评估n
时,将无法在当前堆栈中找到console.log(str2)
frame,因此编译器将一直遵循范围链到我们将str
绑定到'ddd'
和str
到函数的框架。
对于你这个简单的问题,这是一个很长的答案。我稍后会尝试缩短它。此外,我还欢迎更正,因为我对评估过程非常谨慎。