2016-02-12 134 views
0

我一直在JavaScript中探索范围。消息来源指出,作用域是以函数分隔的,而不是像大多数语言那样用块分隔。IF是JavaScript中的一个函数吗?

我把一些代码显示在一些代码我写的,因为我的一些功能中之功能尚不清楚(我),我想看到的范围是如何工作的这些。

令人大跌眼镜的是,在$ .getJSON内$。每个功能的函数,如果(){}子句,显然,作为一个函数处理。我会认为它是一个块。

function displayInfo(nKey) { 
    if(!nKey) var nKey = 0; 
    var objFilm = {}; 
    var imgRef; 
    //iterate through all object properties; display their attributes 
    // Object.keys() returns an array of all property names 
    // for most entries, the object is ...film; check first for array of multiple films 
    jqxhr = $.getJSON('dbMovies.json', function(data) { 
     var xx = "xx"; 
     $.each(data.disc, function(i, xdata) { 
      if(xdata.key == nKey) { 
       objFilm = xdata.film; 
       var yy = "yy"; 
       imgRef = xdata.img; 
       return false; 
      } 
console.log("in jqxhr, xx: " + typeof xx); //this shows 
console.log("in jqxhr, yy: " + typeof yy); //this does NOT 
     }); // $.each 
    }) 
    .done(function() {...} 

if if(){}是一个函数,什么是块?

+1

没有。这不是一个功能。如果它是一个功能。它可能有一个返回值。 'var foo = if(...){...}'是一个平坦的语法错误。这是一个关键字。并注意你的.each里面的'if()'实际上在一个函数内:'function(i,xdata)...' –

+0

'if'不是一个函数。是什么让你认为这是一个功能? –

+0

你可以在这里阅读有关的语言规范语句:http://www.ecma-international.org/ecma-262/5.1/#sec-12 :) – Goot

回答

8

你在if中有一个return false,因此这两个日志语句只有在if条件不成立并且由if控制的块没有运行的情况下才会到达。如果该块没有运行,则yy未被赋值。它的范围是,但未初始化。

+0

即使在那里工作,“返回false”吗?我知道'forEach'没有用,对$'.each'不太确定...... – Andy

+0

@Andy从'$ .each'返回false会停止循环。 – JJJ

2

的功能被分配给仅通过其范围,该范围是保证包括其中函数中声明的范围的限制变量。

if() { }不是函数...它是一个块。它没有在你的例子中显示的原因是因为你有return false在日志发生之前就会中断,并且当日志发生时,变量仍然是未定义的。

(function() { 
 

 
    if (true) var x = "if declared variable"; /* block declaration */ 
 
    
 
    document.getElementById('if').innerHTML = x ? x : 'undefined'; 
 
    
 
    (function() { 
 
    var y = "function declared variable"; 
 
    })(); 
 
    
 
    if (typeof y != 'undefined') 
 
     document.getElementById('func').innerHTML = y 
 
    else 
 
     document.getElementById('func').innerHTML = 'undefined'; 
 
    
 
})();
if: <span id="if"></span> 
 
<br> 
 
func: <span id="func"></span>