pxt-calliope/docs/js/variables.html

277 lines
70 KiB
HTML
Raw Normal View History

2017-08-19 17:16:35 +02:00
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<meta charset="UTF-8">
<title>calliope mini - Blocks / Javascript editor - calliope</title>
<meta name="Description" content="A Blocks / JavaScript code editor for the calliope mini." />
<!-- include meta.html -->
<!-- This file is typically overriden by the target, with own Twitter
account etc. Most data is taken from the theme file though.
-->
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@mspxtio" />
<meta name="twitter:title" content="calliope mini - Blocks / Javascript editor - calliope" />
<meta name="twitter:description" content="A Blocks / JavaScript code editor for the calliope mini." />
<meta name="twitter:image" content="data:image/png;base64,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
<meta property="og:title" content="calliope mini - Blocks / Javascript editor - calliope" />
<meta property="og:site_name" content="PXT" />
<meta property="og:type" content="website" />
<meta property="og:description" content="A Blocks / JavaScript code editor for the calliope mini." />
<meta property="fb:app_id" content="" />
<meta property="og:image" content="data:image/png;base64,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
<link rel="apple-touch-icon" href="data:image/png;base64,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
<link rel="icon" type="image/png" href="data:image/png;base64,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
<link rel="shortcut icon" href="data:image/png;base64,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
<meta name="theme-color" content="#249899">
<!-- end include meta.html -->
<!-- include head.html -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width,height=device-height,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
<link rel="stylesheet" href="/pxt-calliope/semantic.css" />
<link rel="stylesheet" href="/pxt-calliope/docfiles/style.css" />
<link rel="stylesheet" href="/pxt-calliope/docfiles/vs.css" />
<link rel="stylesheet" href="/pxt-calliope/docfiles/target.css" />
<link rel="stylesheet" href="/pxt-calliope/docfiles/fork.css" />
<script src="/pxt-calliope/jquery.js"></script>
<script src="/pxt-calliope/semantic.js"></script>
<script src="/pxt-calliope/lzma/lzma_worker-min.js"></script>
<script src="/pxt-calliope/embed.js" type="text/javascript"></script>
<script src="/pxt-calliope/docfiles/docs.js" type="text/javascript"></script>
<script src="/pxt-calliope/docfiles/target.js" type="text/javascript"></script>
<script src="/pxt-calliope/docfiles/fork.js" type="text/javascript"></script>
<style>
.ui.accent { color: #249899; }
.ui.inverted.accent { background: #249899; }
</style>
<script>
$(document).ready(function() {
// patch youtube in semantic
if ($ && $.fn && $.fn.embed && $.fn.embed.settings && $.fn.embed.settings.sources && $.fn.embed.settings.sources.youtube) {
$.fn.embed.settings.sources.youtube.url = '//www.youtube.com/embed/{id}?rel=0'
}
$('.ui.embed').embed();
})
</script>
<!-- end include head.html -->
</head>
<body id='root' class='root'>
<!-- include header.html -->
<div class="ui fixed accent inverted menu">
<div class="ui container">
<a href="/pxt-calliope/docs/.html" class="header item">
<img class="ui mini image" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9IkViZW5lXzEiCiAgIHg9IjBweCIKICAgeT0iMHB4IgogICB2aWV3Qm94PSIwIDAgMTc1LjQ5OTk5IDE3Mi40IgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA4NDEuOSA1OTUuMyIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9IkxvZ29fQ2FsbGlvcGVfV29tYW4uc3ZnIgogICB3aWR0aD0iMTc1LjUiCiAgIGhlaWdodD0iMTcyLjM5OTk5Ij48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1MDExIj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT48L2RjOnRpdGxlPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNTAwOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTEzNyIKICAgICBpZD0ibmFtZWR2aWV3NTAwNyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC4zNDIwODMzNyIKICAgICBpbmtzY2FwZTpjeD0iNDIwLjk1MDAxIgogICAgIGlua3NjYXBlOmN5PSIyOTcuNjQ5OTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIxNTYiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJFYmVuZV8xIiAvPjxnCiAgICAgaWQ9Imc0OTU1IgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjAuOTAwMjUsLTIwNC4xKSI+PGcKICAgICAgIGlkPSJnNDk1NyI+PGRlZnMKICAgICAgICAgaWQ9ImRlZnM0OTU5Ij48cmVjdAogICAgICAgICAgIGlkPSJTVkdJRF83XyIKICAgICAgICAgICB4PSIxOTMuMTAwMDEiCiAgICAgICAgICAgeT0iMjA0LjEwMDAxIgogICAgICAgICAgIHdpZHRoPSIzMTguMjk5OTkiCiAgICAgICAgICAgaGVpZ2h0PSIyNTYuMjk5OTkiIC8+PC9kZWZzPjxjbGlwUGF0aAogICAgICAgICBpZD0iU1ZHSURfMV8iPjx1c2UKICAgICAgICAgICB4bGluazpocmVmPSIjU1ZHSURfN18iCiAgICAgICAgICAgb3ZlcmZsb3c9InZpc2libGUiCiAgICAgICAgICAgaWQ9InVzZTQ5NjMiCiAgICAgICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgeD0iMCIKICAgICAgICAgICB5PSIwIgogICAgICAgICAgIHdpZHRoPSIxMDAlIgogICAgICAgICAgIGhlaWdodD0iMTAwJSIgLz48L2NsaXBQYXRoPjwvZz48ZwogICAgICAgaWQ9Imc0OTY1Ij48ZGVmcwogICAgICAgICBpZD0iZGVmczQ5NjciPjxyZWN0CiAgICAgICAgICAgaWQ9IlNWR0lEXzlfIgogICAgICAgICAgIHg9IjE5My4xMDAwMSIKICAgICAgICAgICB5PSIyMDQuMTAwMDEiCiAgICAgICAgICAgd2lkdGg9IjMxOC4yOTk5OSIKICAgICAgICAgICBoZWlnaHQ9IjI1Ni4yOTk5OSIgLz48L2RlZnM+PGNsaXBQYXRoCiAgICAgICAgIGlkPSJTVkdJRF8yXyI+PHVzZQogICAgICAgICAgIHhsaW5rOmhyZWY9IiNTVkdJRF85XyIKICAgICAgICAgICBvdmVyZmxvdz0idmlzaWJsZSIKICAgICAgICAgICBpZD0idXNlNDk3MSIKICAgICAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICB4PSIwIgogICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgd2lkdGg9IjEwMCUiCiAgICAgICAgICAgaGVpZ2h0PSIxMDAlIiAvPjwvY2xpcFBhdGg+PC9nPjxnCiAgICAgICBpZD0iZzQ5NzMiPjxkZWZzCiAgICAgICAgIGlkPSJkZWZzNDk3NSI+PHJlY3QKICAgICAgICAgICBpZD0iU1ZHSURfMTFfIgogICAgICAgICAgIHg9IjE5My4xMDAwMSIKICAgICAgICAgICB5PSIyMDQuMTAwMDEiCiAgICAgICAgICAgd2lkdGg9IjMxOC4yOTk5OSIKICAgICAgICAgICBoZWlnaHQ9IjI1Ni4yOTk5OSIgLz48L2RlZnM+PGNsaXBQYXRoCiAgICAgICAgIGlkPSJTVkdJRF8zXyI+PHVzZQogICAgICAgICAgIHhsaW5rOmhyZWY9IiNTVkdJRF8xMV8iCiAgICAgICAgICAgb3ZlcmZsb3c9InZpc2libGUiCiAgICAgICAgICAgaWQ9InVzZTQ5NzkiCiAgICAgICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc
</a>
<!-- Menu -->
</div>
</div>
<!-- end include header.html -->
<div id="docs" class="ui main container mainbody">
<div class="ui breadcrumb">
<a class=" section"
href="/pxt-calliope/docs/js.html">js</a><i class="right chevron icon divider"></i><a class="active section"
href="/pxt-calliope/docs/js/variables.md.html">variables.md</a>
</div>
<div class="ui text">
<h1 id="variable-declarations">Variable Declarations</h1>
<p>Declaring a variable in JavaScript has always traditionally been done with the <code>var</code> keyword.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">var</span> a = <span class="hljs-number">10</span>;</code></pre>
<p>The <code>var</code> construct has some <a href="http://www.typescriptlang.org/docs/handbook/variable-declarations.html">problems</a>,
which is why <code>let</code> statements were introduced. Apart from the keyword used, <code>let</code> statements are written
the same way <code>var</code> statements are.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">let</span> a = <span class="hljs-number">10</span>;</code></pre>
<p>The key difference is not in the syntax, but in the semantics, which well now dive into.</p>
<h2 id="block-scoping">Block-scoping</h2>
<p>When a variable is declared using <code>let</code>, it uses what some call <em>lexical-scoping</em> or <em>block-scoping</em>.
Unlike variables declared with <code>var</code> whose scopes leak out to their containing function,
block-scoped variables are not visible outside of their nearest containing block or <code>for</code>-loop.</p>
<pre><code class="lang-typescript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">f</span>(<span class="hljs-params">input: <span class="hljs-built_in">boolean</span></span>) </span>{
<span class="hljs-keyword">let</span> a = <span class="hljs-number">100</span>;
<span class="hljs-keyword">if</span> (input) {
<span class="hljs-comment">// Still okay to reference 'a'</span>
<span class="hljs-keyword">let</span> b = a + <span class="hljs-number">1</span>;
<span class="hljs-keyword">return</span> b;
}
<span class="hljs-comment">// Error: 'b' doesn't exist here</span>
<span class="hljs-keyword">return</span> b;
}</code></pre>
<p>Here, we have two local variables <code>a</code> and <code>b</code>.
<code>a</code>s scope is limited to the body of <code>f</code> while <code>b</code>s scope is limited to the containing <code>if</code> statements block.</p>
<p>Another property of block-scoped variables is that they cant be read or written to before theyre actually declared.
While these variables are “present” throughout their scope, all points up until their declaration are part of their <em>temporal dead zone</em>.
This is just a sophisticated way of saying you cant access them before the <code>let</code> statement, and luckily TypeScript will let you know that.</p>
<pre><code class="lang-typescript-ignore">a++; <span class="hljs-comment">// illegal to use 'a' before it's declared;</span>
<span class="hljs-keyword">let</span> a;</code></pre>
<h2 id="re-declarations">Re-declarations</h2>
<p>With <code>var</code> declarations, it doesnt matter how many times you declare your variables, you just get one:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">var</span> x = <span class="hljs-number">10</span>;
<span class="hljs-keyword">var</span> x = <span class="hljs-number">20</span>;</code></pre>
<p>In the above example, all declarations of <code>x</code> actually refer to the <em>same</em> <code>x</code>, and this is perfectly valid.
This often ends up being a source of bugs. Thankfully, <code>let</code> declarations are not as forgiving.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">let</span> x = <span class="hljs-number">10</span>;
<span class="hljs-keyword">let</span> x = <span class="hljs-number">20</span>; <span class="hljs-comment">// error: can't re-declare 'x' in the same scope</span></code></pre>
<h2 id="shadowing">Shadowing</h2>
<p>The act of introducing a new name in a more deeply nested scope is called <em>shadowing</em>.
It is a bit of a double-edged sword in that it can introduce certain bugs on its own in the
event of accidental shadowing, while also preventing certain bugs.
For instance, imagine a <code>sumMatrix</code> function using <code>let</code> variables.</p>
<pre><code class="lang-typescript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sumMatrix</span>(<span class="hljs-params">matrix: <span class="hljs-built_in">number</span>[][]</span>) </span>{
<span class="hljs-keyword">let</span> sum = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; matrix.length; i++) {
<span class="hljs-keyword">var</span> currentRow = matrix[i];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; currentRow.length; i++) {
sum += currentRow[i];
}
}
<span class="hljs-keyword">return</span> sum;
}</code></pre>
<p>This version of the loop will actually perform the summation correctly because the inner loops <code>i</code> shadows <code>i</code> from the outer loop.
Shadowing should <em>usually</em> be avoided in the interest of write clearer code, such as</p>
<pre><code class="lang-typescript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sumMatrix</span>(<span class="hljs-params">matrix: <span class="hljs-built_in">number</span>[][]</span>) </span>{
<span class="hljs-keyword">let</span> sum = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; matrix.length; i++) {
<span class="hljs-keyword">var</span> currentRow = matrix[i];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-number">0</span>; j &lt; currentRow.length; j++) {
sum += currentRow[j];
}
}
<span class="hljs-keyword">return</span> sum;
}</code></pre>
<p>While there are some scenarios where it may be fitting to take advantage of it, you should use your best judgement.</p>
<h1 id="-const-declarations"><code>const</code> declarations</h1>
<p><code>const</code> declarations are another way of declaring variables.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> numLivesForCat = <span class="hljs-number">9</span>;</code></pre>
<p>They are like <code>let</code> declarations but, as their name implies, their value cannot be changed once they are bound.
In other words, they have the same scoping rules as <code>let</code>, but you cant re-assign to them.</p>
<a class="ui primary button" href="/pxt-calliope/docs/js/operators.html">
<p>NEXT: Operators</p>
</a>
</div>
<p style="margin-top:1em"><a href="https://github.com/Microsoft/pxt-calliope/blob/master/docs/docs/js/variables.md"><i class="write icon"></i>Edit this page on GitHub</a></p>
</div>
<!-- include footer.html -->
<div class="ui inverted accent vertical footer segment">
<div class="ui center aligned container">
<div class="ui horizontal inverted small divided link list">
<a class="item" href="https://www.pxt.io/" title="Programming Experience Toolkit">Powered by PXT</a>
<a class="item" href="https://www.pxt.io/contact">Contact Us</a>
<a class="item" href="https://www.pxt.io/privacy">Privacy &amp; Cookies</a>
<a class="item" href="https://www.pxt.io/legal">Terms Of Use</a>
<a class="item" href="https://www.pxt.io/trademarks">Trademarks</a>
<div class="item">© 2016 Microsoft</div>
<!-- we need to force the browser to load this font -->
<div style='font-family: Icons; color: #010101;' aria-hidden="true">.</div>
</div>
<a class="item" href="https://www.microsoft.com/"><img class="ui centered image" src="https://az851932.vo.msecnd.net/pub/pmapoirq" /></a>
</div>
</div>
<!-- end include footer.html -->
<!-- include macros.html -->
<!-- macro button -->
<!-- macro vimeo -->
<!-- macro youtube -->
<!-- macro section -->
<!-- macro hide -->
<!-- macro avatar -->
<!-- macro hint -->
<!-- wrapped around ordinary content -->
<!-- macro main-container -->
<!-- used for 'column' box - they are collected and wrapped in 'column-container' -->
<!-- macro column -->
<!-- macro column-container -->
<!-- Menu on the top of the page -->
<!-- macro item -->
<!-- macro divider -->
<!-- macro top-dropdown -->
<!-- macro inner-dropdown -->
<!-- end include macros.html -->
<!-- include tracking.html -->
<script type="text/javascript">
var appInsights=window.appInsights||function(config){
function i(config){t[config]=function(){var i=arguments;t.queue.push(function(){t[config].apply(t,i)})}}var t={config:config},u=document,e=window,o="script",s="AuthenticatedUserContext",h="start",c="stop",l="Track",a=l+"Event",v=l+"Page",y=u.createElement(o),r,f;y.src=config.url||"https://az416426.vo.msecnd.net/scripts/a/ai.0.js";u.getElementsByTagName(o)[0].parentNode.appendChild(y);try{t.cookie=u.cookie}catch(p){}for(t.queue=[],t.version="1.0",r=["Event","Exception","Metric","PageView","Trace","Dependency"];r.length;)i("track"+r.pop());return i("set"+s),i("clear"+s),i(h+a),i(c+a),i(h+v),i(c+v),i("flush"),config.disableExceptionTracking||(r="onerror",i("_"+r),f=e[r],e[r]=function(config,i,u,e,o){var s=f&&f(config,i,u,e,o);return s!==!0&&t["_"+r](config,i,u,e,o),s}),t
}({
instrumentationKey:"9801ed01-c40f-46ec-aa40-2a1742a9e71c",
disableAjaxTracking: true,
overridePageViewDuration: false,
disableExceptionTracking: true,
isCookieUseDisabled: true,
isStorageUseDisabled: true
});
window.appInsights=appInsights;
appInsights.queue.push(function () {
appInsights.context.addTelemetryInitializer(function (envelope) {
if (typeof pxtConfig === "undefined") return;
var telemetryItem = envelope.data.baseData;
telemetryItem.properties = telemetryItem.properties || {};
telemetryItem.properties["target"] = pxtConfig.targetId;
telemetryItem.properties["version"] = pxtConfig.targetVersion;
telemetryItem.properties["stage"] = (pxtConfig.relprefix || "/--").replace(/[^a-z]/ig, '')
if (typeof window !== "undefined" && window.location && /[?&]electron=1/i.test(window.location.href))
telemetryItem.properties["electron"] = 1;
});
});
appInsights.trackPageView();
</script>
<!-- end include tracking.html -->
</body>
</html>