JavaScript块级作用域 vs 函数作用域

4
以下代码片段完全相同吗?如果不是,请问有什么区别?
var x = (function() {
    ... //a
    return function(){
        ... //b
    };
})();

对比。

var x;
{
    ... //a
    x = function(){
        ... //b
    };
}

@JohnS请不要像那样将代码粘贴到标题中。请将您的代码发布到正文中。 - JohnP
@JohnP 你说得没错,但是你的标题太泛泛了,就像是“我的代码有什么问题?”一样。 - Ali Shakiba
@JohnS 但这不是你在问的。将代码粘贴到标题中并不能使其可读。请随意为您的问题提出更好的问题陈述。 - JohnP
@JohnP 你看过这个网址吗:https://dev59.com/s3RC5IYBdhLWcg3wUvQS - Ali Shakiba
@JohnP我已经改了,现在怎么样? - Ali Shakiba
显示剩余2条评论
2个回答

6

有一个重要的区别:在JavaScript中,代码块不会引入新的变量作用域。因此,你不能在// a代码块中定义私有变量。请比较以下内容:

var x = (function() {
    var v = 42;
    return function(){
        return v;
    };
})();
// v; would yield ReferenceError: v is not defined, so you need to call x

并且

var x;
{
    var v = 42;
    x = function(){
        return v;
    };
}
// v is 42 here, that's not what's intended.

0

一个主要的区别是,在执行 ...//a 时,x 不存在。在你的情况下,两种情况都是 undefined,但一般来说,可以在 ...//a 过程中访问 x 变量,而在第一种情况下则不行。

除此之外,在你的情况下,基本上是相同的。毕竟,在你的情况下,该代码基本上被重构为一个单独的函数,就像其他任何语言一样。


2
还有一件事:{var z = 1;}将在窗口命名空间中创建变量z,而(function(){var z = 2;}())不会污染全局命名空间。这就是为什么函数选项更受欢迎的原因。 - Dan Manastireanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接