Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
if块在javascript中是一个单独的闭包吗_Javascript - Fatal编程技术网

if块在javascript中是一个单独的闭包吗

if块在javascript中是一个单独的闭包吗,javascript,Javascript,据我所知,一个函数,比如在另一个函数中定义的a,也就是说B可以访问B的局部变量 function B() { var x = 10; function A() { console.log(x); //will result in 10 var y = 5; } console.log(y); //ReferenceError: y is not defined } 然而,在下面的示例中,y被打印出来。我知道javasc

据我所知,一个函数,比如在另一个函数中定义的a,也就是说B可以访问B的局部变量

function B() {
    var x = 10;
    function A() {
        console.log(x);    //will result in 10
        var y = 5;
    }
    console.log(y);    //ReferenceError: y is not defined
}
然而,在下面的示例中,y被打印出来。我知道javascript中没有“if block”的块作用域,但声明是否至少应该在“if”之外不可见?我的意思是,变量y不应该被限制为if block

function B() {
    var x = 10;
    if(1) {
        console.log(x);    //will result in 10
        var y = 5;
    }
    console.log(y);    will result in 5
}

JavaScript并不是真正的块范围。
if
for
循环没有自己的作用域。任何给定范围(即:全局范围或函数)中的所有变量声明都将被提升,并且在该范围内的任何位置都可见。
ECMAScript 6(Harmony)很可能会通过使用新的
let
关键字将块范围引入JS:

话虽如此:
不过,您可以通过使用闭包来模拟块范围的循环。函数是有作用域的,闭包是函数返回的函数或对象。这意味着函数的返回值可以访问整个函数的作用域
应用此处解释的内容,并找出此循环为何为“伪作用域”:

var foo=[1,2,3,4,5,6],
largerThan3=(函数(arr)
{
var resultar=[];
对于(变量i=0;变量i=3)
结果推(arr[i]);
}
返回结果器;
}(foo);;
控制台日志(i)//参考错误。。。

JavaScript不是真正的块范围。
if
for
循环没有自己的作用域。任何给定范围(即:全局范围或函数)中的所有变量声明都将被提升,并且在该范围内的任何位置都可见。
ECMAScript 6(Harmony)很可能会通过使用新的
let
关键字将块范围引入JS:

话虽如此:
不过,您可以通过使用闭包来模拟块范围的循环。函数是有作用域的,闭包是函数返回的函数或对象。这意味着函数的返回值可以访问整个函数的作用域
应用此处解释的内容,并找出此循环为何为“伪作用域”:

var foo=[1,2,3,4,5,6],
largerThan3=(函数(arr)
{
var resultar=[];
对于(变量i=0;变量i=3)
结果推(arr[i]);
}
返回结果器;
}(foo);;
控制台日志(i)//参考错误。。。
没有。 正如您所说——如果块在JS中没有自己的闭包——这意味着所有东西都是外部闭包的一部分(在本例中,y是B闭包中的局部变量)。所以它会在B的身体里完全可见。
正如您所说——如果块在JS中没有自己的闭包——这意味着所有东西都是外部闭包的一部分(在本例中,y是B闭包中的局部变量)。因此它将在B的主体中完全可见

答案是这样的问题:“JavaScript中没有块作用域”是不是在JavaScript中块是一个单独的闭包没有not@Cerbrus我不确定块范围和闭包概念之间的联系。我希望这个问题的答案也能解决这个问题。我非常确定“如果在javascript中阻止一个单独的闭包吗?”是一个有效的问题,不需要否决。我也非常确定“if block在javascript中是一个单独的闭包吗?”不需要解释为“if block在javascript中是一个单独的块范围吗?”因为我想理解details@Fishy:block scope就是它,请参见我答案中的第一个片段:循环有自己的作用域,在循环之外,其中声明的变量根本不存在。闭包由从ouside无法访问的元素组成,除非通过闭包返回的内容(函数、对象…)。Cf在我的回答中的链接是的,谢谢,很好的回答!!!我们不能把下面的概念也看作是闭包,除了你提到的,返回的对象/函数可以访问外部范围的变量。“一个函数中的任何变量都可以通过该函数中定义的子函数访问,但不能通过相反的方式访问”答案是这样的:“JavaScript中没有块作用域”是不是块在JavaScript中是一个单独的闭包没有not@Cerbrus我不确定块范围和闭包概念之间的联系。我希望这个问题的答案也能解决这个问题。我非常确定“如果在javascript中阻止一个单独的闭包吗?”是一个有效的问题,不需要否决。我也非常确定“if block在javascript中是一个单独的闭包吗?”不需要解释为“if block在javascript中是一个单独的块范围吗?”因为我想理解details@Fishy:block scope就是它,请参见我答案中的第一个片段:循环有自己的作用域,在循环之外,其中声明的变量根本不存在。闭包由从ouside无法访问的元素组成,除非通过闭包返回的内容(函数、对象…)。Cf在我的回答中的链接是的,谢谢,很好的回答!!!我们不能把下面的概念也看作是闭包,除了你提到的,返回的对象/函数可以访问外部范围的变量。“函数中的任何变量都可以通过该函数中定义的子函数访问,但不能通过相反的方式访问”
for (let i=0;i<12;++i)
{
    console.log(i);//logs i
}
console.log(i);//reference error
var someClosure = (function()
{//this function creates a scope
    var x = 123;
    return {
        getX: function()
        {
            return x;
        },
        setX: function(val)
        {
            return x = val;
        }
    };
}());
console.log(x);//reference error
console.log(someClosure.getX());//returns 123, so "x" still exists
var foo = [1,2,3,4,5,6],
    largerThan3 = (function(arr)
    {
        var resultArr = [];
        for (var i=0;i<arr.length;++i)
        {
            if (arr[i] > 3)
                resultArr.push(arr[i]);
        }
        return resultArr;
    }(foo));
console.log(i);//reference error...