作为参数和不带参数访问函数内部变量的区别是什么?
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)
}
答案 0 :(得分:2)
此处的主要区别在于y
除了提供给函数的参数外不使用其他任何东西。一旦看到函数调用-说y(1, 2)
-您就会确切知道会发生什么。 (假设您至少相当熟悉该功能及其功能,但是即使您不熟悉该功能,也希望它的名称能够使它足够清楚。)
与x
的不同之处在于,它从外部(这里是全局)变量a
和b
读取。换句话说,它取决于未显式提供给函数的输入。这使得很难理解对x()
的调用会做什么,因为它取决于a
和b
的值-它们在程序中可能被分配了很远的距离。确实,也许可以用不同的方式或通过其他功能来更改其值-在这种情况下,除非仔细研究整个程序直到调用之前,否则无法确切知道x()
会做什么。再次,与y
形成对比,我们只需要查看呼叫站点,而无需其他任何事情。
但是,在某些实际情况下,很难避免某种“全局状态”,要尽可能地避免它,并尝试将函数需要的信息保留在本地,例如{{1} }-无疑是更好的设计。它使代码更易于理解,因此也很少有错误。
答案 1 :(得分:0)
JavaScript总是按值传递,因此更改变量的值永远不会更改基础基元(字符串或数字)。
如果您在作为参数传递的函数中修改std::basic_string_view
,则它不会更改原始变量的值(按值传递)。
std::basic_string_view
答案 2 :(得分:0)
在第二个函数的范围内,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()
答案 3 :(得分:0)
这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;
}