2015-07-21 55 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

我不確定我是否正確理解,但是您不會在這裏傳遞任何字符串,thisLayer是您傳遞的對象。 – 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 +)定義,則變量是塊範圍的(此行爲更類似於大多數其他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' 

在所有這些情況下,函數的變量的範圍內定義仍可以訪問變量本身(技術上講你創建一個封閉,作爲numOfLayers和​​變量詞法範圍你的addToStringdoAllLayers函數)。

請注意,範圍規則在技術上比這更細微一些,但是您最好在此處閱讀更深入的文章。

0

您已定義var resultStr = "";外部函數,它是一個全局變量。您可以訪問addToString()內的全局變量並開始連接。請注意,在該方法內,您還沒有聲明var resultStr = "";,否則它將是該方法的局部變量。