两个javascript函数行为背后的逻辑
请解释这两种行为背后的逻辑,以便于理解两个javascript函数行为背后的逻辑,javascript,Javascript,请解释这两种行为背后的逻辑,以便于理解 var a = 10; function foo(){ a = 20; } foo(); console.log(a); 打印--->a=20 var a = 10; function foo(a){ a = 20; } foo(); console.log(a); 打印--->a=10 因为范围 在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变
var a = 10;
function foo(){
a = 20;
}
foo();
console.log(a);
打印--->a=20
var a = 10;
function foo(a){
a = 20;
}
foo();
console.log(a);
打印--->a=10 因为范围
在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变量
更新:
值得一提的是,使用ES6的arrow函数,如果您的函数是在父类或函数中定义的,那么您仍然可以使用this关键字访问外部变量
范例
class Bar {
this.a = 10;
this.foo = function(a) {
this.a = 20;
};
this.foo2 = (a) => {
this.a = 20;
};
}
不完全相同,但它是关于范围的,因为范围
在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变量
更新:
值得一提的是,使用ES6的arrow函数,如果您的函数是在父类或函数中定义的,那么您仍然可以使用this关键字访问外部变量
范例
class Bar {
this.a = 10;
this.foo = function(a) {
this.a = 20;
};
this.foo2 = (a) => {
this.a = 20;
};
}
不完全相同,但它是关于作用域的。在javascript中,如果使用var、let、const或使用函数中形式参数中提供的变量,函数变量有自己的作用域。如果不使用上述任何变量,则变量的作用域将是全局的 在javascript中,如果您使用var、let、const或使用函数中形式参数中提供的变量,函数变量有自己的作用域。如果不使用上述任何变量,则变量的作用域将是全局的 在第一个示例中,函数中的
a
正在替换函数外部的a
的第一个声明,因为您没有使用var
(或let
或const
)对其进行局部范围限定
在第二个示例中,函数接受a
作为参数,因此它在函数的局部范围内。请注意,即使a
未实际传递到函数中(因此未定义
),也会发生这种情况
这可能会对您有所帮助。在第一个示例中,函数中的
a
将替换函数外部的a
的第一个声明,因为您没有使用var
(或let
或const
)对其进行局部范围限定
在第二个示例中,函数接受a
作为参数,因此它在函数的局部范围内。请注意,即使a
未实际传递到函数中(因此未定义
),也会发生这种情况
这可能会对您有所帮助。请检查以下代码片段
var a=10;
var b=a;
函数foo(a){
//a此处指的是参数a,而不是全局变量,因为它被重写了
控制台日志(a,b);
a=20;
}
foo();
//打印全局变量a
控制台日志(a);
功能条(){
控制台日志(a,b);
//重写全局变量a
a=20;
}
bar();
//打印全局变量a
控制台日志(a)代码>检查以下代码段
var a=10;
var b=a;
函数foo(a){
//a此处指的是参数a,而不是全局变量,因为它被重写了
控制台日志(a,b);
a=20;
}
foo();
//打印全局变量a
控制台日志(a);
功能条(){
控制台日志(a,b);
//重写全局变量a
a=20;
}
bar();
//打印全局变量a
控制台日志(a)代码>第一个是因为全局范围
var a=10;
函数foo(){
a=20;
}
在这里,varieble a是全局访问的,并从函数内部更新全局varieble可以访问每个位置
在第二个示例中,仅将varieble a的引用作为参数传递,并且在函数内部接收的参数值发生更改
var a =10;
function foo(a){
a= 20;
console.log(a)
}
foo();
console.log(a);
请在console中运行代码的第二个示例,这样您就可以理解更改。第一个示例是因为全局范围
var a=10;
函数foo(){
a=20;
}
在这里,varieble a是全局访问的,并从函数内部更新全局varieble可以访问每个位置
在第二个示例中,仅将varieble a的引用作为参数传递,并且在函数内部接收的参数值发生更改
var a =10;
function foo(a){
a= 20;
console.log(a)
}
foo();
console.log(a);
请在console中运行第二个代码示例,这样您就可以理解更改。Scopes。函数foo首先检查其作用域中是否定义了“a”,如果未定义,则检查外部作用域..,依此类推。函数foo首先检查其作用域中是否定义了“a”,如果未定义,则检查外部作用域..以此类推