函数表达式中的变量范围

时间:2015-06-04 05:30:27

标签: javascript function

我最近一直在学习一些基础知识,并花了很多时间来反汇编一些函数表达式以更好地理解它们。我仍然有点不确定在几个例子中究竟发生了什么,并且如果我错了,或者至少确认我的思路是否正确,我想对它做一些解释。

有三个代码片段,它们略有不同:

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);

我感到好奇的是,让他们像他们一样工作的确切情况。

第一种情况似乎比较直接 - my_number作为全局开始,number是函数的本地,my_number在函数内部发生变化,所以它在10全球框架。

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

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

var timesTwo = function(my_number)

即使函数体中没有var my_number

2 个答案:

答案 0 :(得分:0)

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,并将其值设置为7timesTwo是一个函数,在其参数中接受一个参数,然后在函数中将其引用为number。调用该函数时,您将全局范围中定义的my_number变量设置为等于传入的参数乘以2。您正在使用“内部”和“外部”调用记录相同的结果。

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);

在第二个示例中,您在my_number函数中声明了一个本地作用域timesTwo。因此,您在“内部”和“外部”调用中记录了不同的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);

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

答案 1 :(得分:0)

这称为variable shadowing

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

这将遮蔽外部my_number,以便函数体内对 my_number 的任何引用都将引用传入参数而不是外部 my_number 变量。