变量方法中变量“str2”的可用性如何

时间:2015-11-19 06:06:50

标签: javascript

变量'str2'如何在传递给display方法的回调方法中可用? str2应仅在函数'name'中可见。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

4 个答案:

答案 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到函数的框架。

对于你这个简单的问题,这是一个很长的答案。我稍后会尝试缩短它。此外,我还欢迎更正,因为我对评估过程非常谨慎。