<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Anastasia Zotova]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://anastasiazotova.com/</link><image><url>http://anastasiazotova.com/favicon.png</url><title>Anastasia Zotova</title><link>https://anastasiazotova.com/</link></image><generator>Ghost 3.1</generator><lastBuildDate>Tue, 07 Apr 2026 13:08:33 GMT</lastBuildDate><atom:link href="https://anastasiazotova.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[About my blog]]></title><description><![CDATA[<p>I wrote this blog while attending the Hack Reactor coding bootcamp in 2014-15. Most of the posts in this blog are detailed solutions to the <a href="http://perfectionkills.com/javascript-quiz/">Perfection Kills</a> JavaScript quiz.</p>]]></description><link>https://anastasiazotova.com/about-my-blog/</link><guid isPermaLink="false">5de97e0c34208c0e3a04cb15</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Wed, 04 Dec 2019 22:01:00 GMT</pubDate><content:encoded><![CDATA[<p>I wrote this blog while attending the Hack Reactor coding bootcamp in 2014-15. Most of the posts in this blog are detailed solutions to the <a href="http://perfectionkills.com/javascript-quiz/">Perfection Kills</a> JavaScript quiz.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 14)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>.</p><p>Finally, we've reached the last question of the Perfection Kills Quiz.</p><p>14)</p><pre><code class="language-javascript"> with (function(x, undefined){}) length;</code></pre><p>Correct answer: 2.</p><p>To answer this question, it is helpful to look at</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-14/</link><guid isPermaLink="false">5df1368f34208c0e3a04d0c8</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 22 Jan 2015 18:34:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>.</p><p>Finally, we've reached the last question of the Perfection Kills Quiz.</p><p>14)</p><pre><code class="language-javascript"> with (function(x, undefined){}) length;</code></pre><p>Correct answer: 2.</p><p>To answer this question, it is helpful to look at the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with">definition</a> of <em>with statement</em>. A with statement consists of an expression (in the parentheses) and a statement or a block of statements. The expression is added to the scope chain used when evaluating the statement.</p><p>To get a better feel of what a with statement is, we can play with a couple of examples in the console.</p><p>Example 1:</p><pre><code class="language-javascript">a; //throws an error "a is not defined"
   //as the property "a" is not defined in the global scope;</code></pre><p>Example 2:</p><pre><code class="language-javascript">with ({a: "b"}) a; //evaluates to "b"</code></pre><p>In the quiz question, the expression is <code>function(x, undefined){}</code>. The statement is <code>length</code>. The snippet of code evaluates to the value of property "length" on the object <code>function(x, undefined){}</code>. Function objects' length property <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length">specifies the number of arguments expected by the function</a>. The function <code>function(x, undefined){}</code> expects two arguments. Hence, its length property has the value 2.</p><p>Note that <em>undefined</em> is just a name of the function's second parameter rather than the value <em>undefined</em>.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 13)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>.</p><p>13)</p><pre><code class="language-javascript">function f(){ return f; }
new f() instanceof f;</code></pre><p>Correct answer: false.</p><p>In this snippet of code, the instanceof operator checks whether the left operand <code>new f()</code> has the object <code>f.</code></p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-13/</link><guid isPermaLink="false">5ded19ca34208c0e3a04d050</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 22 Jan 2015 17:23:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>.</p><p>13)</p><pre><code class="language-javascript">function f(){ return f; }
new f() instanceof f;</code></pre><p>Correct answer: false.</p><p>In this snippet of code, the instanceof operator checks whether the left operand <code>new f()</code> has the object <code>f.prototype</code> in its prototype chain.</p><p>Let's go through the code that runs when the left operand <code>new f()</code> is evaluated:</p><p>1) Function <em>f</em> is invoked in the "construction mode";<br>2) A new object is created, inheriting from <code>f.prototype</code>, and <em>this</em> keyword is bound to the newly created object (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new">source</a>). The interpreter inserts the line</p><pre><code class="language-javascript">this = Object.create(f.prototype);</code></pre><p>as the first line of the function body.<br>3) Function <em>f</em> returns its return value. In this case, its return value is the function <em>f</em> itself.</p><p>The newly created object (described in step 2) is constructed in such a way that it has the object <code>f.prototype</code> in its prototype chain. The problem is that function <em>f</em> never returns this object. Instead, it returns function <em>f</em>, which does not have <code>f.prototype</code> in its prototype chain. For this reason, the snippet of code evaluates to false.</p><p>If there was no explicit return statement in function <em>f</em>, the result would have been true.</p><pre><code class="language-javascript">function f(){}
new f() instanceof f; //true </code></pre><p>If a function does not have an explicit return statement and is run in the "construction mode", it returns the newly created object inheriting from <code>f.prototype</code>.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 12)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>.</p><p>12)</p><pre><code class="language-javascript">(function f(){
  function f(){ return 1; }
  return f();
  function f(){ return 2; }
})();</code></pre><p>Correct answer: 2.</p><p>For simplicity, I will refer to the "outer" function</p><pre><code class="language-javascript">function f(){
  function f(){ return 1; }
  return</code></pre>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-12/</link><guid isPermaLink="false">5deceb4e34208c0e3a04cfaa</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 22 Jan 2015 14:09:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>.</p><p>12)</p><pre><code class="language-javascript">(function f(){
  function f(){ return 1; }
  return f();
  function f(){ return 2; }
})();</code></pre><p>Correct answer: 2.</p><p>For simplicity, I will refer to the "outer" function</p><pre><code class="language-javascript">function f(){
  function f(){ return 1; }
  return f();
  function f(){ return 2; }
}</code></pre><p>as Function A,  to the function <code>function f(){ return 1; }</code> as Function B, and to the function <code>function f(){ return 2; }</code> as Function C.</p><p>Function A is immediately invoked. The snippet of code evaluates to the return value of this function. In order to determine this return value, we have to find out what <em>f</em> in the statement <code>return f();</code> refers to.</p><p>Theoretically, <em>f</em> could refer to any of the three functions: A, B, or C. Let me start by explaining why <em>f</em> could have referred to any of them under some circumstances.</p><p>Function A is defined with a <em>named function expression</em> (you can read more on them <a href="http://kangax.github.io/nfe/">here</a>). The name of Function A <em><strong>f</strong></em> is available within the function local scope. Hence, <em>f</em> in the function body (specifically in the statement <code>return f();</code>) can refer to Function A.</p><p>Function B is defined with a function declaration. Function declarations 'move' function definitions to the top of the current scope. In case of Function B, this is not too interesting, because this function is declared at the top of the current scope anyway.</p><p>Function C is defined with a function declaration too. Although this function is declared at the very bottom of Function A body, its definition is 'moved' to the top of the current scope (in this case the current scope is the scope of Function A). Hence, the variable <em>f</em> in the statement <code>return f();</code> can refer to Function C.</p><p>Obviously, when the statement <code>return f();</code> is executed, the variable <em>f</em> refers to one value only. Let's find out which one.</p><p>First, when Function A has just been initialized, the identifier <em>f</em> points to Function A. As explained in <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">the post on question 5</a> of Perfection Kills Quiz, the Function A's identifier <em>f</em> is an outer variable relative to the Function A local scope. Then the declaration of Function B creates a new variable <em>f</em>, which points to Function B and belongs to the Function A local scope. Finally, the declaration of Function C redefines <em>f</em> in the local scope and makes it point to Function C.</p><p>At the moment when the line <code>return f();</code> runs, the interpreter will first look for a variable <em><em>f</em></em> in the Function A local scope and will find it there. This variable <em>f</em> points to Function C. The expression <code>f()</code> evaluates to 2, and Function A returns 2.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 11)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>.</p><p>11)</p><pre><code class="language-javascript">(function(foo){
  return typeof foo.bar;
})({ foo: { bar: 1 } });</code></pre><p>Correct answer: "undefined".</p><p>This is also one of the easier questions of the quiz.</p><p>The anonymous function <code>function(foo) {return typeof foo.bar;</code></p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-11/</link><guid isPermaLink="false">5dece0fe34208c0e3a04cf38</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 22 Jan 2015 11:39:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>.</p><p>11)</p><pre><code class="language-javascript">(function(foo){
  return typeof foo.bar;
})({ foo: { bar: 1 } });</code></pre><p>Correct answer: "undefined".</p><p>This is also one of the easier questions of the quiz.</p><p>The anonymous function <code>function(foo) {return typeof foo.bar;}</code> is immediately invoked with the argument <code>{ foo: {bar: 1} }</code>.</p><p>The <em>foo</em> in the body of the function refers to the parameter <em>foo</em>, which has the value <code>{ foo: {bar: 1} }</code>. Hence, <em>foo.bar</em> refers to the property 'bar' of this object. However, the object <code>{ foo: {bar: 1} }</code> does not have a property 'bar'. It has only one property 'foo' (and the value of this property is an object with the property 'bar', but 'bar' is not the property of the "original" object). For this reason, <em>foo.bar</em> is undefined. Since <code>typeof undefined</code> is "undefined", the return value of our snippet of code is "undefined".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 10)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>.</p><p>10)</p><pre><code class="language-javascript">var x = [typeof x, typeof y][1];
typeof typeof x;</code></pre><p>Correct answer: "string".</p><p>Compared to other questions in the quiz, this is a relatively easy one. Let's just go step by step parsing</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-10/</link><guid isPermaLink="false">5decdc5034208c0e3a04cedc</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Wed, 21 Jan 2015 11:18:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>.</p><p>10)</p><pre><code class="language-javascript">var x = [typeof x, typeof y][1];
typeof typeof x;</code></pre><p>Correct answer: "string".</p><p>Compared to other questions in the quiz, this is a relatively easy one. Let's just go step by step parsing and executing the code.</p><p>Since the '=' operator assigns the value of its right operand to its left operand, we first need to evaluate the expression <code>[typeof x, typeof y][1]</code>. We are executing the first line of code, and neither <em>x</em> nor <em>y</em> variables have been defined so far. Hence, <em>x</em> has the value <em>undefined</em> and <code>typeof x</code> evaluates to the string "undefined". For the same reason <code>typeof y</code> also evaluates to "undefined".</p><p>The original snippet of code can be rewritten in the following way:</p><pre><code class="language-javascript">var x = ["undefined", "undefined"][1];
typeof typeof x;</code></pre><p>From here, we get:</p><pre><code class="language-javascript">var x = "undefined"; //note that "undefined" is a string
typeof typeof x;</code></pre><p>The variable <em>x</em> points to the string "undefined". Then <code>typeof x</code> is the string "string", and <code>typeof typeof x</code> is the string "string" too.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 9)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>.</p><p>9)</p><pre><code class="language-javascript">var x = 1;
if (function f(){}) {
  x += typeof f;
}
x;</code></pre><p>Correct answer: "1undefined".</p><p>This question is closely related to <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">question 2</a> from the same quiz.</p><p>First of all, it's important to understand that <code>function</code></p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-9/</link><guid isPermaLink="false">5dec1d2e34208c0e3a04ce5f</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Wed, 21 Jan 2015 10:49:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>.</p><p>9)</p><pre><code class="language-javascript">var x = 1;
if (function f(){}) {
  x += typeof f;
}
x;</code></pre><p>Correct answer: "1undefined".</p><p>This question is closely related to <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">question 2</a> from the same quiz.</p><p>First of all, it's important to understand that <code>function f(){}</code> is a (named) function expression rather than a function declaration. This follows from the fact that the condition in an <em>if statement</em> should be an expression that evaluates to true or false. Also, the grouping operator, i.e. the parenthesis, can only contain an expression.</p><p>Now let's determine whether our function expression evaluates to true or false. The only values that would evaluate to false are  0, -0, null, false, NaN, undefined, or the empty string (""). All other values evaluate to true (see <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean">MDN</a>). Hence, the function expression evaluates to true and the statement within the <em>if</em> block is executed.</p><p>The statement <code>x += typeof f;</code> within the <em>if</em> block is equivalent to <code>x = x + typeof f;</code>. <em><strong>f</strong></em> in the named function expression is the function name, and it's only available in the scope of the function itself. Since the statement <code>x += typeof f;</code> is outside of the function's scope, <em>f</em> is undefined and <code>typeof f</code> evaluates to the string "undefined". Due to automatic type conversion, the variable <em>x</em> is assigned the value "1undefined".</p><p>For the discussion of named function expressions, see the following resources: <a href="http://kangax.github.io/nfe/">Named function expressions demystified</a> by Juriy "kangax" Zaytsev, definition of function expression on <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function">MDN</a>.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 8)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>.</p><p>8)</p><pre><code class="language-javascript">var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;</code></pre><p>Correct answer: "number".</p><p>In order to understand this snippet of code, we have to look into the comma operator. A good explanation of</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-8/</link><guid isPermaLink="false">5dec17d834208c0e3a04ce0d</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Fri, 16 Jan 2015 21:21:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>.</p><p>8)</p><pre><code class="language-javascript">var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;</code></pre><p>Correct answer: "number".</p><p>In order to understand this snippet of code, we have to look into the comma operator. A good explanation of the subject can be found <a href="https://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/">here</a>. According to <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator">MDN</a>, "the comma operator evaluates each of its operands (from left to right) and returns the value of the last operand". Here is a simple example:</p><pre><code class="language-javascript">var y = ("abc", 5);
y; //5</code></pre><p>Parentheses are needed in order to create a group and apply the comma operator before the '=' operator.</p><p>In our case, the expression <code>(function f(){ return "1"; }, function g(){ return 2; })</code> evaluates to <code>function g(){ return 2; }</code>. As a result, the original snippet of code is equivalent to the following one:</p><pre><code class="language-javascript">var f = (function g(){ return 2; })();
typeof f;</code></pre><p>Function <code>function g(){ return 2; }</code> is immediately invoked and returns 2. Hence, the variable <em>f</em> is assigned the value of 2 and <code>typeof f</code> is "number".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 7)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>.</p><p>7)</p><pre><code class="language-javascript">var foo = {
  bar: function(){ return this.baz; },
  baz: 1
}
typeof (f = foo.bar)();</code></pre><p>Correct answer: "undefined".</p><p>This question is very similar to the previous one (see <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">part 6</a>).</p><p>First, let's consider the following snippet of code,</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-7/</link><guid isPermaLink="false">5debca4434208c0e3a04cda3</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 08 Jan 2015 15:50:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>.</p><p>7)</p><pre><code class="language-javascript">var foo = {
  bar: function(){ return this.baz; },
  baz: 1
}
typeof (f = foo.bar)();</code></pre><p>Correct answer: "undefined".</p><p>This question is very similar to the previous one (see <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">part 6</a>).</p><p>First, let's consider the following snippet of code, which looks very similar:</p><pre><code class="language-javascript">var foo = {
  bar: function(){ return this.baz; },
  baz: 1
}
typeof foo.bar();</code></pre><p>This snippet of code returns the value "number". <em>foo.bar</em> points to a function, and when this function is invoked, its <em>this</em> keyword refers to the object <em>foo</em>.</p><p>In the original snippet of code, we start by assigning the value of <em>foo.bar</em> to the variable <em>f</em>. As a result, the variable <em>f</em> points to the function <code>function(){ return this.baz; }</code>. However, when this function is invoked, the keyword <em>this</em> no longer refers to <em>foo</em>. The original snippet of code is roughly equivalent to the following one:</p><pre><code class="language-javascript">var f = function(){
  return this.baz;
}
typeof f();</code></pre><p>The function <code>function(){ return this.baz; }</code> is invoked as a freestanding function, so the keyword <em>this</em> refers to the global object. As the global object does not have the property <em>baz</em>, the function returns <em>undefined</em>. Since <code>typeof undefined</code> is "undefined", the return value of our snippet of code is "undefined".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 6)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>.</p><p>6)</p><pre><code class="language-javascript">var foo = {
  bar: function(){ return this.baz; },
  baz: 1
};
(function(){
  return typeof arguments[0]();
})(foo.bar);</code></pre><p>Correct answer: "undefined".</p><p>For simplicity, I will refer to the function <code>function(){ return this.baz; }</code> as Function A and to the</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-6/</link><guid isPermaLink="false">5deb6acb34208c0e3a04cd07</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Mon, 29 Dec 2014 15:19:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>.</p><p>6)</p><pre><code class="language-javascript">var foo = {
  bar: function(){ return this.baz; },
  baz: 1
};
(function(){
  return typeof arguments[0]();
})(foo.bar);</code></pre><p>Correct answer: "undefined".</p><p>For simplicity, I will refer to the function <code>function(){ return this.baz; }</code> as Function A and to the function <code>function(){ return typeof arguments[0](); }</code> as Function B.</p><p>Function B is immediately invoked with the argument <em>foo.bar</em>, which evaluates to Function A. The whole snippet of code returns the value of <code>typeof arguments[0]();</code>, so we can focus just on this line.</p><p>It is tempting to believe that the statement <code>return typeof arguments[0]();</code> returns the same value as the statement <code>return typeof foo.bar();</code>. However, this is not true. Although both <em>foo.bar</em> and <em>arguments[0]</em> point to the same function, i.e. Function A, in those two cases the keyword <em>this</em> in the body of Function A refers to two different objects.</p><p>If <em>foo.bar</em> was invoked, the keyword <em>this</em> in Function A would refer to the object <em>foo</em>. This object has a property <em>baz</em>, and hence Function A would have returned the value 1 (a number).</p><p>It is important to understand that our snippet of code does not invoke <em>foo.bar</em>. When function B is invoked, the <em>arguments</em> object is created, and its [0] property points to Function A rather than <em>foo.bar</em>. When the line <code>return typeof arguments[0]();</code> is executed, the keyword <em>this</em> in Function A refers to the <em>arguments</em> object. As this object does not have a property <em>baz</em>, Function A returns <em>undefined</em>. Since <code>typeof undefined</code> is "undefined", the return value of our snippet of code is "undefined".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 5)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>.</p><p>5)</p><pre><code class="language-javascript">(function f(f){
  return typeof f();
 })(function(){ return 1; });</code></pre><p>Correct answer: "number".</p><p>The function <code>f(f) {return typeof f();}</code> is immediately invoked with the argument <code>function(){ return 1; }</code>.</p><p>The expression <code>function f(f) {return typeof f();}</code> is a</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-5/</link><guid isPermaLink="false">5deb5c3434208c0e3a04cc5f</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Sun, 28 Dec 2014 08:10:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>.</p><p>5)</p><pre><code class="language-javascript">(function f(f){
  return typeof f();
 })(function(){ return 1; });</code></pre><p>Correct answer: "number".</p><p>The function <code>f(f) {return typeof f();}</code> is immediately invoked with the argument <code>function(){ return 1; }</code>.</p><p>The expression <code>function f(f) {return typeof f();}</code> is a named function expression. The first <em><strong>f</strong></em> (outside the parenthesis) is the name of the function, which is available within the function local scope. The second <em><strong>f</strong></em> (in the parenthesis) is just a parameter, which is also available within the function local scope.</p><p>So what does the <em>f</em> in the body of the function refer to?  There are two possible "candidates" for the value of <em>f</em> in this scope: function name <em>f</em> and the value of the parameter <em>f</em>, but of course <em>f</em> can refer to only one thing. In order to answer this question, one has to know where the function name is actually 'stored'.</p><p>I will quote a great <a href="http://kangax.github.io/nfe/">article on named function expressions</a> by the author of the Perfection Kills Quiz: "When named function expression is evaluated, a special object is created. The sole purpose of that object is to hold a property with the name corresponding to function identifier, and value corresponding to function itself. That object is then injected into the front of the current scope chain, and this 'augmented' scope chain is then used to initialize a function".</p><p>This means that the function name is an outer variable relative to the function local scope. The invoked function will first look for the variable <em>f</em> in its local scope, where this variable refers to the value of the parameter <em>f</em>.</p><p>Hence, <em>f</em> in the statement <code>return typeof f();</code> refers to the argument of the invoked function. This argument is <code>function(){ return 1; }</code>.</p><p>Important note: if the function parameter had a different name, <em>f</em> in the function body would have referred to the function itself.</p><p>Now let's evaluate <code>typeof f()</code>. The <code>f()</code> is equal to the return value of the function <code>function(){ return 1; }</code>, which is 1. Then <code>typeof f()</code> equals <code>typeof 1</code>, i.e. "number".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 4)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>.</p><p>4)</p><pre><code class="language-javascript">var y = 1, x = y = typeof x;
x;</code></pre><p>Correct answer: "undefined".</p><p>The '=' operator in JavaScript has right associativity, which means that <code>x = y = typeof x</code> is equivalent to <code>x = (y = typeof x)</code>. First, the expression <code>typeof x</code></p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-4/</link><guid isPermaLink="false">5deb58ec34208c0e3a04cc16</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Fri, 26 Dec 2014 07:46:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>.</p><p>4)</p><pre><code class="language-javascript">var y = 1, x = y = typeof x;
x;</code></pre><p>Correct answer: "undefined".</p><p>The '=' operator in JavaScript has right associativity, which means that <code>x = y = typeof x</code> is equivalent to <code>x = (y = typeof x)</code>. First, the expression <code>typeof x</code> is evaluated. Since <em>x</em> has not been defined yet, <code>typeof x</code> evaluates to the string "undefined". After that, <em>y</em> is assigned the value of "undefined", and then <em>x</em> is assigned the same value. As a result, when the second line of code in this snippet is run, <em>x</em> has the value of "undefined" (a string).</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 3)]]></title><description><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>.</p><p>3)</p><pre><code class="language-javascript">(function(x){
  delete x;
  return x;
})(1);</code></pre><p>Correct answer: 1.</p><p>The line of code <code>delete x;</code> does not actually delete <em>x</em>, so the immediately invoked function returns the value of <em>x</em>, i.e. 1. To check whether the line <code>delete</code></p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-3/</link><guid isPermaLink="false">5dead8e434208c0e3a04cbc8</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Tue, 23 Dec 2014 22:40:00 GMT</pubDate><content:encoded><![CDATA[<p>Previous posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>.</p><p>3)</p><pre><code class="language-javascript">(function(x){
  delete x;
  return x;
})(1);</code></pre><p>Correct answer: 1.</p><p>The line of code <code>delete x;</code> does not actually delete <em>x</em>, so the immediately invoked function returns the value of <em>x</em>, i.e. 1. To check whether the line <code>delete x;</code> deletes <em>x</em>, we can modify the code in the following way:</p><pre><code class="language-javascript">(function(x){
  console.log(delete x);
  return x;
})(1);</code></pre><p>The logged value in this case is <em>false</em>, and <code>delete</code> only returns <em>false</em> if the property cannot be deleted.</p><p>The best explanation of why <em>x</em> is not deleted can be found here: <a href="http://perfectionkills.com/understanding-delete/">http://perfectionkills.com/understanding-delete/</a>. When a function is executed, its arguments become properties of the function's activation object: <code>activation_object.x = 1</code>. These properties have DontDelete attribute, hence they cannot be deleted.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 2)]]></title><description><![CDATA[<p>Let's continue to explore the 'Perfection Kills' quiz.</p><p>2)</p><pre><code class="language-javascript">var f = function g(){ return 23; };
typeof g();</code></pre><p>Correct answer: error.</p><p>There are two common ways two define a function in JavaScript.</p><p>i) With a function expression that is assigned to a variable. In this case, one defines a variable that</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-2/</link><guid isPermaLink="false">5deac2d334208c0e3a04cb67</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Fri, 19 Dec 2014 21:06:00 GMT</pubDate><content:encoded><![CDATA[<p>Let's continue to explore the 'Perfection Kills' quiz.</p><p>2)</p><pre><code class="language-javascript">var f = function g(){ return 23; };
typeof g();</code></pre><p>Correct answer: error.</p><p>There are two common ways two define a function in JavaScript.</p><p>i) With a function expression that is assigned to a variable. In this case, one defines a variable that refers to a function:</p><pre><code class="language-javascript">var fun = function () {};</code></pre><p>This line of code is an assignment statement, and <code>function () {}</code> is is an (unnamed) <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function">function expression</a>.</p><p>ii) With a function declaration:</p><pre><code class="language-javascript">function fun() {};</code></pre><p>The two methods are almost equivalent. The only difference is that function declaration is hoisting the function definition (moving it to the top of the current scope).</p><p>In the quiz question, the function is defined with an assignment statement and not declared. What makes this question tricky is that the assignment statement uses a <em>named function expression</em> <code>function g(){ return 23; }</code>. <em><strong>g</strong></em> is the function name, and it's only available in the scope of the function itself (see <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function">MDN article</a>, Parameters section). Since the second line of code in the snippet (<code>typeof g();</code>) is outside of the function body, both <code>g()</code> and <code>typeof g()</code> return an error. The expression <code>typeof g</code> would have evaluated to "undefined".</p><p>A great discussion of named function expressions can be found in this <a href="http://kangax.github.io/nfe/">article</a> by Juriy "kangax" Zaytsev.</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item><item><title><![CDATA[Perfection Kills Quiz (part 1)]]></title><description><![CDATA[<p>Recently I took the 'Perfection Kills' JavaScript quiz (<a href="http://perfectionkills.com/javascript-quiz/">http://perfectionkills.com/javascript-quiz/</a>) and found it quite insightful. I thought it would be interesting to go through the solution to some of the quiz problems.</p><p>Attention: spoilers ahead.</p><p>All the questions are structured in the same way. There is a snippet</p>]]></description><link>https://anastasiazotova.com/perfection-kills-quiz-part-1/</link><guid isPermaLink="false">5deabd3834208c0e3a04cb31</guid><dc:creator><![CDATA[Anastasia Zotova]]></dc:creator><pubDate>Thu, 18 Dec 2014 20:42:00 GMT</pubDate><content:encoded><![CDATA[<p>Recently I took the 'Perfection Kills' JavaScript quiz (<a href="http://perfectionkills.com/javascript-quiz/">http://perfectionkills.com/javascript-quiz/</a>) and found it quite insightful. I thought it would be interesting to go through the solution to some of the quiz problems.</p><p>Attention: spoilers ahead.</p><p>All the questions are structured in the same way. There is a snippet of code and one has to predict what it evaluates to.</p><p>1)</p><pre><code class="language-javascript">(function(){
  return typeof arguments;
 })();</code></pre><p>Correct answer: "object".</p><p>First of all, we see parentheses immediately after the function definition. This means that our function is immediately invoked, and our snippet of code returns the return value of the anonymous function, i.e. <code>typeof arguments</code>. 'arguments' is an array-like object of all arguments passed to a function. In our case, as no arguments are passed to the function (there is nothing in the last pair of parentheses), 'arguments' object looks like an empty array. The typeof operator with an array or an object returns the string "object".</p><p>All posts on Perfection Kills JavaScript quiz: <a href="http://anastasiazotova.com/perfection-kills-quiz-part-1/">1</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-2/">2</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-3/">3</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-4/">4</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-5/">5</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-6/">6</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-7/">7</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-8/">8</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-9/">9</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-10/">10</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-11/">11</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-12/">12</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-13/">13</a>, <a href="http://anastasiazotova.com/perfection-kills-quiz-part-14/">14</a>.</p>]]></content:encoded></item></channel></rss>