通过传递参数和全局变量来访问函数内部的变量之间的区别?

时间:2018-09-12 16:48:13

标签: javascript

作为参数和不带参数访问函数内部变量的区别是什么?

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

4 个答案:

答案 0 :(得分:2)

此处的主要区别在于y除了提供给函数的参数外不使用其他任何东西。一旦看到函数调用-说y(1, 2)-您就会确切知道会发生什么。 (假设您至少相当熟悉该功能及其功能,但是即使您不熟悉该功能,也希望它的名称能够使它足够清楚。)

x的不同之处在于,它从外部(这里是全局)变量ab读取。换句话说,它取决于未显式提供给函数的输入。这使得很难理解对x()的调用会做什么,因为它取决于ab的值-它们在程序中可能被分配了很远的距离。确实,也许可以用不同的方式或通过其他功能来更改其值-在这种情况下,除非仔细研究整个程序直到调用之前,否则无法确切知道x()会做什么。再次,与y形成对比,我们只需要查看呼叫站点,而无需其他任何事情。

但是,在某些实际情况下,很难避免某种“全局状态”,要尽可能地避免它,并尝试将函数需要的信息保留在本地,例如{{1} }-无疑是更好的设计。它使代码更易于理解,因此也很少有错误。

答案 1 :(得分:0)

  

JavaScript总是按值传递,因此更改变量的值永远不会更改基础基元(字符串或数字)。

如果您在作为参数传递的函数中修改std::basic_string_view,则它不会更改原始变量的值(按值传递)。

std::basic_string_view

答案 2 :(得分:0)

在第二个函数的范围内,ab引用参数,而不是全局变量。

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

答案 3 :(得分:0)

这3例案件的目的不同,有些不详尽:

  1. 在函数内部:

仅在函数调用后必须卸载变量,除非将其返回

function helloworld() {
  const words = ['hello', 'world'];
  return words.join(' ');
}
  1. 作为论点:

每次您要使用外部值来更改结果

 function hello(name) {
   return 'Hello ' + name;
 }
  1. 关闭时:

在其他情况下:

 // 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;
 }