Javascript - 函数声明之间的区别
Javascript - Difference between function declarations
我刚刚开始在 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);
}
是否有理由使用一个而不是另一个?它们是否有任何 performance/security 影响(或对初学者 JS 开发人员的其他意想不到的影响)?
主要区别在于,在第一种情况下,fun2
仅在 fun1
范围内可用。在第二种情况下,两个函数都将在范围内可用,它们的定义是
在 Javascript 中,范围由封闭函数定义。也就是说,函数内定义的代码在函数外是不可见的。
因此,在您的第一个示例中,func2
在 func1
中定义,因此 仅 在 func1
中可见。
在您的第二个示例中,它是在全局范围内定义的(window
对象,当在浏览器中 运行 时),因此可以从任何地方调用,就像 func1
.
如果我们谈论您的第一种方法,则无法调用 fun2
,因为您已将其包含在 fun1
中并且其作用域是局部的。但是,您可以修改 fun1
以调用 fun2
,如下所示:
var fun1 = (function(){
var x = 1;
var fun2 = function(){
x = x*2;
alert(x);
};
return {
fun2: fun2
}
})();
上面的 return 语句将使您的 fun2
成为 public
范围,您可以使用 fun1
对象调用它,如下所示:
fun1.fun2();
Please note that the x
variable is private and only accessible within fun1
function. If you need to access it using fun1.x
, you will have to return it in your fun1
as I've returned fun2
.
这叫做modular or enclosed pattern
。这样我们就可以实现封装。
如果我们谈论您的第二种方法,即非常简单,您的 fun1
将调用 fun2
。我希望,它清除了这个概念。
我刚刚开始在 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);
}
是否有理由使用一个而不是另一个?它们是否有任何 performance/security 影响(或对初学者 JS 开发人员的其他意想不到的影响)?
主要区别在于,在第一种情况下,fun2
仅在 fun1
范围内可用。在第二种情况下,两个函数都将在范围内可用,它们的定义是
在 Javascript 中,范围由封闭函数定义。也就是说,函数内定义的代码在函数外是不可见的。
因此,在您的第一个示例中,func2
在 func1
中定义,因此 仅 在 func1
中可见。
在您的第二个示例中,它是在全局范围内定义的(window
对象,当在浏览器中 运行 时),因此可以从任何地方调用,就像 func1
.
如果我们谈论您的第一种方法,则无法调用 fun2
,因为您已将其包含在 fun1
中并且其作用域是局部的。但是,您可以修改 fun1
以调用 fun2
,如下所示:
var fun1 = (function(){
var x = 1;
var fun2 = function(){
x = x*2;
alert(x);
};
return {
fun2: fun2
}
})();
上面的 return 语句将使您的 fun2
成为 public
范围,您可以使用 fun1
对象调用它,如下所示:
fun1.fun2();
Please note that the
x
variable is private and only accessible withinfun1
function. If you need to access it usingfun1.x
, you will have to return it in yourfun1
as I've returnedfun2
.
这叫做modular or enclosed pattern
。这样我们就可以实现封装。
如果我们谈论您的第二种方法,即非常简单,您的 fun1
将调用 fun2
。我希望,它清除了这个概念。