2015-07-21 5 views
0

Это простой скрипт, который будет записывать содержимое текста из файла Photoshop.Сфера действия JavaScript

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

В чем проблема, код выглядит хорошо для меня. – atinder

+0

Я не уверен, правильно ли я это понял, но вы не проходите сюда, здесь этот слой является объектом, который вы передаете. – abs

+0

@atinder - Мне просто нужно лучше понять область видимости в JavaScript –

ответ

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 +), то переменная является блок-Scoped (такое поведение больше напоминает большинство других языков синтаксиса С-семейства). Пример:

// 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 функций).

Обратите внимание, что правила обзора являются технически немного более нюансированными, чем это, но вам лучше читать более подробную статью на этом этапе.

0

Внешняя функция var resultStr = "";, которая является глобальной переменной. вы можете получить доступ к этой глобальной переменной внутри addToString() и начать с ней конкатенировать. Обратите внимание, что внутри метода, который вы еще не объявили var resultStr = "";, иначе это была бы другая переменная, локальная для этого метода.