【问题标题】:Difference between accessing variable inside a function by passing as argument and global variable?通过作为参数传递和全局变量访问函数内部变量之间的区别?
【发布时间】:2019-02-17 09:10:02
【问题描述】:
作为参数和不带参数访问函数内部变量有什么区别?
var a = 1;
var b = 2;
function x() {
var c = a + b;
console.log(c)
}
function y(a, b) {
var c = a + b;
console.log(c)
}
【问题讨论】:
标签:
javascript
variables
parameters
arguments
closures
【解决方案1】:
这里的关键区别在于y 不使用除了提供给函数的参数之外的任何东西。只要你看到函数调用——比如y(1, 2)——你就知道会发生什么。 (至少假设您相当熟悉该功能及其作用 - 但即使您不熟悉它,也希望它的名称足够清晰。)
与x 的不同之处在于它从外部(此处为全局)变量a 和b 中读取。换句话说,它依赖于未明确提供给函数的输入。这使得更难理解对x() 的调用会做什么,因为它取决于a 和b 的值——它们可能在程序中被分配了相当远的距离。事实上,也许它们的值可以以不同的方式和通过其他函数来改变——在这种情况下,如果不仔细研究整个程序直到调用,就不可能确切地知道x() 会做什么。同样,将其与 y 进行对比,我们只需要查看调用站点,无需其他任何内容。
虽然在某些实际情况下,很难避免某种“全局状态”,但要尽可能避免它,并尝试将函数所需的信息保留在其本地 - 如y -毫无疑问是更好的设计。它使代码更容易理解,因此不太可能出现错误。
【解决方案2】:
Javascript 总是按值传递,所以改变变量的值永远不会改变底层的原语(字符串或数字)。
如果您在作为参数传递的函数内部修改variables,则它不会更改原始变量的值(按值传递)。
var a = 1;
var b = 2;
function x() {
var c = a + b;
a = c;
console.log(c)
}
function y(a, b) {
var c = a + b;
var a = c;
console.log(c)
}
y(a, b)
console.log(a)
console.log(b)
x()
console.log(a)
console.log(b)
【解决方案3】:
这 3 个案例有不同的目的,有些并不详尽:
- 函数内部:
只有在函数调用后必须卸载变量,除非它被返回
function helloworld() {
const words = ['hello', 'world'];
return words.join(' ');
}
- 作为论据:
每次你想使用一个改变结果的外部值
function hello(name) {
return 'Hello ' + name;
}
- 从关闭开始:
在其他情况下:
// inside a lambda
function upperThan(array, n) {
return array.filter(item => item > n);
}
// use a constant
const HELLO = 'Hi';
function sayHello(name) {
return HELLO + ' ' + name;
}
【解决方案4】:
在第二个函数的范围内,a 和 b 指的是参数,而不是全局变量。
var a = 1
var b = 2
function exampleOne () {
console.log("example 1: ", a, b)
}
function exampleTwo (a, b) {
console.log("example 2: ", a, b)
}
exampleOne()
exampleTwo(3, 4)
exampleTwo()