JavaScript 行为范围
Scope in JavaScript behaviour
这是一个简单的脚本,可以记录 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 的范围如何允许这种情况发生?声明的局部变量是否仍然被函数访问,还是我遗漏了另一个技巧?
以下是 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
函数的范围内)。
请注意,范围规则在技术上比这更细微,但此时您最好阅读更深入的文章。
您已经定义了 var resultStr = "";
个外部函数,它是一个全局变量。您可以在 addToString()
中访问这个全局变量并开始连接它。请注意,在方法内部您尚未声明 [=10=] 否则它将是该方法的本地变量。
这是一个简单的脚本,可以记录 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 的范围如何允许这种情况发生?声明的局部变量是否仍然被函数访问,还是我遗漏了另一个技巧?
以下是 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
函数的范围内)。
请注意,范围规则在技术上比这更细微,但此时您最好阅读更深入的文章。
您已经定义了 var resultStr = "";
个外部函数,它是一个全局变量。您可以在 addToString()
中访问这个全局变量并开始连接它。请注意,在方法内部您尚未声明 [=10=] 否则它将是该方法的本地变量。