Javascript 函数表达式中的变量范围

Javascript 函数表达式中的变量范围,javascript,function,Javascript,Function,我最近一直在学习JavaScript的一些基础知识,并花了相当长的时间分解一些函数表达式以更好地理解它们。我仍然有点不确定在这几个例子中到底发生了什么,如果我错了,我希望得到一些解释,或者至少确认我的思路是否正确 共有三段代码,它们之间略有不同: var my_number = 7; var timesTwo = function(number) { my_number = number * 2; console.log("inside " + my_number); };

我最近一直在学习JavaScript的一些基础知识,并花了相当长的时间分解一些函数表达式以更好地理解它们。我仍然有点不确定在这几个例子中到底发生了什么,如果我错了,我希望得到一些解释,或者至少确认我的思路是否正确

共有三段代码,它们之间略有不同:

var my_number = 7;

var timesTwo = function(number) {
    my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);

我好奇的是到底发生了什么事情让他们像他们一样工作

第一种情况似乎相对简单-
my_number
以全局开头,
number
是函数的局部,而
my_number
在函数内部发生了更改,因此在全局框架中为10

第二种情况似乎也很清楚-它与第一种情况类似,只是在赋值为10的函数内部有一个新的局部变量
my_number
,而在函数外部
my_number
仍然是7

我不确定的是第三件。我假设,由于所有提到的
number
现在都是
my_number
,因此该函数将在以下行中创建一个新的
my_number
变量:

var timesTwo = function(my_number)
即使函数体中没有
var my_number

var my_number = 7;

var timesTwo = function(number) {
    my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);
第一个示例在全局范围内声明
my_number
,并将其值设置为
7
timesTwo
是一个函数,它在其参数中接受一个参数,然后在函数中被引用为
number
。调用该函数时,将在全局范围中定义的
my_number
变量设置为等于传入参数乘以2。“内部”和“外部”调用都记录了相同的结果

在第二个示例中,您正在
times2
函数中声明一个局部范围的
my_number
。因此,您在“内部”和“外部”调用中记录了不同的
my_number
变量

在第三个示例中,
times2
接受一个参数,并使用变量
my_number
跟踪它。

这称为

在函数定义中,指定将新局部变量引入函数范围的
my_number
参数


这将对外部的my_number进行阴影处理,因此函数体中对my_number的任何引用都将引用传入参数,而不是外部my_number变量。

这是正确的,这个问题基本上可以取消询问=)所有函数参数都是函数范围内的变量
var timesTwo = function(my_number)
var my_number = 7;

var timesTwo = function(number) {
    my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);
var my_number = 7;

var timesTwo = function(number) {
    var my_number = number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);
var my_number = 7;

var timesTwo = function(my_number) {
    my_number = my_number * 2;
    console.log("inside " + my_number);
};

timesTwo(5);
console.log("outside " + my_number);