我最近一直在学习一些基础知识,并花了很多时间来反汇编一些函数表达式以更好地理解它们。我仍然有点不确定在几个例子中究竟发生了什么,并且如果我错了,或者至少确认我的思路是否正确,我想对它做一些解释。
有三个代码片段,它们略有不同:
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
?
答案 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
,并将其值设置为7
。 timesTwo
是一个函数,在其参数中接受一个参数,然后在函数中将其引用为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)
在函数定义中,指定my_number
参数,该参数将新的局部变量引入函数的范围。
这将遮蔽外部my_number
,以便函数体内对 my_number 的任何引用都将引用传入参数而不是外部 my_number 变量。