2017-04-13 109 views
0

我刚刚开始使用Javascript进行开发,并且一直在阅读范围和执行上下文。我在想,如果有这之间的差异:Javascript - 函数声明之间的区别

function fun1() { 
    var x = 1; 

    function fun2() { 
     x = x*2; 
     alert(x); 
    } 
} 

和:

function fun1() { 
    var x = 1; 
    fun2(x); 
} 

function fun2 (x) { 
    x = x*2; 
    alert(x); 
} 

会不会有理由使用一个比其他?他们是否有任何性能/安全影响(或对初学者JS开发人员有其他意想不到的影响)?

+0

那么......在第一个例子中,不可能调用fun2。 – Quentin

+0

第二个例子更适合重用性。现在你可以在其他函数中再次调用function ** fun2 **。 – user3004449

+0

@Quentin从'fun1'外面不可能,里面不是。 – Arg0n

回答

0

如果我们讨论您的第一种方法,则不可能调用fun2,因为您已将其包含在fun1之内,并且其范围是本地范围。然而,你可以ammend你fun1调用fun2如下:

var fun1 = (function(){ 

    var x = 1; 

    var fun2 = function(){ 
     x = x*2; 
     alert(x); 
    }; 

    return { 
     fun2: fun2 
    } 

})(); 

以上return语句会让你fun2public范围,你可以按如下与fun1对象调用它:

fun1.fun2(); 

请注意,x变量是私有的,只能在fun1函数内访问。如果您需要使用fun1.x访问它,则必须返回fun1,因为我已返回fun2

这叫做modular or enclosed pattern。由此我们可以实现封装。

如果我们谈论你的第二种方法,即非常简单,你的fun1将调用fun2。我希望,它清除了这个概念。

2

主要区别在于第一种情况fun2将仅在fun1范围内可用。在第二种情况下,这两种功能都可在范围内使用,其定义如下:

0

在Javascript范围内由封闭函数定义。也就是说,函数中定义的代码在函数外部是不可见的。

因此,在您第一次例如,func2里面func1定义,因而可见只有func1

在第二个示例中,它在全局范围内定义(window对象,在浏览器中运行时),因此可以在任何地方调用,就像func1一样。

相关问题