我刚刚开始使用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 :(得分:2)
主要区别在于,第一种情况fun2
仅在fun1
范围内可用。在第二种情况下,两个函数都将在范围内可用,其定义为
答案 1 :(得分:0)
在Javascript范围内由封闭函数定义。也就是说,函数内定义的代码在函数外部是不可见的。
因此,在您的第一个示例中,func2
定义在func1
内,因此func1
内仅显示 。
在你的第二个例子中,它在全局范围(window
对象,在浏览器中运行时)中定义,因此可以从任何地方调用,就像func1
一样。
答案 2 :(得分:0)
如果我们谈论您的第一种方法,则无法调用fun2
,因为您已将其括在fun1
内且其范围是本地的。不过,您可以按照以下方式修改fun1
致电fun2
:
var fun1 = (function(){
var x = 1;
var fun2 = function(){
x = x*2;
alert(x);
};
return {
fun2: fun2
}
})();
以上返回语句会使您的fun2
作为public
范围,您可以使用fun1
对象调用它,如下所示:
fun1.fun2();
请注意,
x
变量是私有的,只能在fun1
函数中访问。如果您需要使用fun1.x
访问它,则必须在我fun1
返回fun2
时将其返回。
这称为modular or enclosed pattern
。通过这个我们可以实现封装。
如果我们谈论您的第二种方法,即非常简单,您的fun1
会致电fun2
。我希望,它清除了这个概念。