这是一个简单的脚本,可以记录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的范围如何允许这种情况发生?声明的局部变量是否仍由函数访问,还是我错过的另一个技巧?
答案 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
}
var
或let
关键字(例如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'
在所有这些情况下,在变量范围内定义的函数仍然可以访问变量本身(从技术上讲,您创建了一个闭包,因为numOfLayers
和resultStr
变量是词法上的在addToString
和doAllLayers
函数的范围内。
请注意,范围界定规则在技术上比这更细微,但您最好在此时阅读更深入的文章。
答案 1 :(得分:0)
您已定义var resultStr = "";
外部函数,它是一个全局变量。您可以在addToString()
中访问此全局变量并开始连接它。请注意,在方法内部,您尚未声明var resultStr = "";
,否则它将是该方法的本地变量。