JavaScript行为中的范围

时间:2015-07-21 10:35:13

标签: javascript scope photoshop-script

这是一个简单的脚本,可以记录Photoshop文件中的文本内容。

var numOfLayers = app.activeDocument.layers.length;
var resultStr = "";

doAllLayers();
alert(resultStr);

function addToString(alayer)
{
  if (alayer.kind == "LayerKind.TEXT")
  {
    var c = alayer.textItem.contents;
    resultStr += c;
  }
}

// main loop
function doAllLayers()
{
  for (var i = numOfLayers -1; i >= 0; i--)
  {
      var thisLayer = app.activeDocument.layers[i];
      addToString(thisLayer);
  }
}

它工作正常,但我真的应该将一个字符串传递给函数添加到自身,但它的工作原理。 JavaScript的范围如何允许这种情况发生?声明的局部变量是否仍由函数访问,还是我错过的另一个技巧?

2 个答案:

答案 0 :(得分:1)

以下是JavaScript中变量作用域的一些基本规则:

  • 如果使用var关键字定义,则变量是功能范围的。也就是说,变量将限定为最接近的包含函数,或者如果没有包含函数则限定为全局上下文。 例如:
   
// globally-scoped variable (no containing function)
var foo = 'bar';

function test() {
    // function-scoped variable
    var foo2 = 'bar2';

    if (true) {
        // still function-scoped variable, regardless of the if-block
        var foo3 = 'bar3';
    }

    // see?
    console.log(foo3); // --> 'bar3'
}
  • 如果使用let关键字(ES6 +)定义,则变量是块范围的(此行为更类似于大多数其他C系列语法语言)。例如:
   
// error: top level "let" declarations aren't allowed
let foo = 'bar';

function test() {
    // block-scoped variable (function are blocks, too)
    let foo2 = 'bar2';

    if (true) {
        // block-scoped variable (notice the difference
        // from the previous example?)
        let foo3 = 'bar3';
    }

    // uh oh?
    console.log(foo3); // --> ReferenceError: foo3 is not defined
}
  • 如果既未定义varlet关键字(例如foo = bar),则该变量的范围限定为全局上下文。例如:
   
// globally-scoped variable
foo = 'bar';

function test() {
    // also globally-scoped variable (no var or let declaration)
    foo2 = 'bar2';

    if (true) {
        // still a globally-scoped variable
        foo3 = 'bar3';
    }
}

test();
console.log(foo, foo2, foo3); // 'bar', 'bar2', 'bar3'

在所有这些情况下,在变量范围内定义的函数仍然可以访问变量本身(从技术上讲,您创建了一个闭包,因为numOfLayersresultStr变量是词法上的在addToStringdoAllLayers函数的范围内。

请注意,范围界定规则在技术上比这更细微,但您最好在此时阅读更深入的文章。

答案 1 :(得分:0)

您已定义var resultStr = "";外部函数,它是一个全局变量。您可以在addToString()中访问此全局变量并开始连接它。请注意,在方法内部,您尚未声明var resultStr = "";,否则它将是该方法的本地变量。

相关问题